Как сделать функцию построения графика S3 generi c в R? - PullRequest
0 голосов
/ 14 июля 2020

Итак, я пытался создать функцию построения графика S3 generi c в R ... Я прочитал несколько блогов и примеров, объясняющих функции S3 ... но мне все еще трудно понять это. В моем пакете есть функция, которая создает матрицу. Затем у меня также есть другая функция, которая принимает созданную матрицу в качестве аргумента и затем отображает эту матрицу как тепловую карту. Я пытаюсь превратить эту вторую функцию (т.е. построение тепловой карты) в функцию S3 generi c. Приведенный ниже пример, надеюсь, объяснит, что я имею в виду.

Для начала у меня есть функция для создания матрицы:

#' myMatrix
#'
#' @description Creates Matrix
#'
#' @param rows No of rows
#' @param cols No of cols
#'
#' @importFrom stats "runif"
#'
#' @export

myMatrix <- function(rows = 10, cols = 10){

n <- rows   # no or rows
p <- cols    # no of cols

# Create matrix of values
myMat <- matrix(runif(n*p, 0, 1), nrow=n)               # Create matrix
colnames(myMat) <- paste0("x", 1:p)                     # Name columns
rownames(myMat) <- paste0("x", 1:p)                     # Name rows
return(myMat)
}

Затем я бы сохранил результат матрицы следующим образом:

mat <- myMatrix(10,10)

Затем в отдельном скрипте я пытался создать функцию построения графиков S3 generi c, например:

#' heatMapTEST
#'
#' @description Plots plot
#'
#' @param myMat Given Matrix
#'
#' @importFrom ggplot2 "ggplot"
#'
#' @export

heatMapTEST <- function(myMat){
  UseMethod('plot')}

#' @export
plot.heatMapTEST <- function(myMat){

  df <- reshape2::melt(myMat, c("x", "y"), value.name = "z")
  head(df)
  ggplot(data=df,aes(x=x,y=y,fill=z))+
    geom_tile()
}

А потом (я думаю) я бы назвал это примерно так:

plot(heatMapTEST(mat))

Но это возвращает ошибку:

Ошибка в h (simpleError (msg, call)): ошибка при оценке аргумента 'x' в выбор метода для функции "plot": нет применимого метода для "plot", примененного к объекту класса "c ('matrix', 'array', 'double', 'numeri c')"

Я новичок в написании методов S3, поэтому на самом деле я понятия не имею, прав ли я хотя бы частично в том, как я это делаю ... какие-либо предложения относительно того, как я мог бы создать общий S3, чтобы я мог использовать функцию heatMapTEST с общей функцией c plot?

1 Ответ

3 голосов
/ 14 июля 2020

Методы S3 работают, когда вы добавляете классы к своим объектам. Если вы хотите, чтобы ваша матрица имела специальный метод построения графика, вам просто нужно добавить к ней класс. Наблюдайте

myMatrix <- function(rows = 10, cols = 10){
  
  n <- rows   # no or rows
  p <- cols    # no of cols
  
  # Create matrix of values
  myMat <- matrix(runif(n*p, 0, 1), nrow=n)               # Create matrix
  colnames(myMat) <- paste0("x", 1:p)                     # Name columns
  rownames(myMat) <- paste0("x", 1:p)                     # Name rows
  class(myMat) <- c("heatMapTEST", class(myMat))
  return(myMat)
}
class(myMatrix(10, 10))
# [1] "heatMapTEST" "matrix"      "array"  

Итак, эта функция теперь имеет класс "heatMapTEST", но она также будет вести себя как матрица - никаких специальных методов для этого класса не существует. Когда вы вызываете plot(), он будет соответствовать первому возможному классу. Вы можете увидеть все существующие общие методы построения c с помощью methods(plot). Вы можете создать свой собственный, как и выше

plot.heatMapTEST <- function(myMat){
  df <- reshape2::melt(myMat, c("x", "y"), value.name = "z")
  head(df)
  ggplot(data=df,aes(x=x,y=y,fill=z))+
    geom_tile()
}

, и вы просто вызовете plot() для объекта, возвращенного из myMatrix, чтобы получить свой график

plot(myMatrix(10,10))

введите описание изображения здесь

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...