首页 > 解决方案 > 如何在 R 中制作 S3 通用绘图功能?

问题描述

所以我一直在尝试在 R 中创建一个 S3 通用绘图函数......我已经阅读了几个解释 S3 函数的博客和示例......但我仍然无法弄清楚这一点。在我的包中,我有一个创建矩阵的函数。然后,我还有另一个函数,它将创建的矩阵作为参数,然后将该矩阵绘制为热图。我正在尝试将第二个函数(即绘制热图)转换为 S3 通用函数。下面的例子有望解释我的意思。

首先,我有一个创建矩阵的函数:

#' 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 通用绘图函数,如下所示:

#' 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))中的错误:在为函数“plot”选择方法时评估参数“x”时出错:没有适用于“plot”的方法应用于类“c('matrix', '数组','双','数字')“

我对编写 S3 方法非常陌生,所以我真的不知道我是否部分正确地执行此操作......关于如何创建通用 S3 以允许我使用该heatMapTEST函数的任何建议通用plot功能?

标签: rfunction

解决方案


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(),它会看起来匹配它可以匹配的第一类。您可以使用 . 查看所有现有的通用绘图方法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))

在此处输入图像描述


推荐阅读