r - 如何在 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
功能?
解决方案
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))
推荐阅读
- java - 从列表末尾删除的 Android 代码帮助
- python - int() 和 floor() 可以互换吗?
- python - 将字符串中的最后一个数字迭代一个
- database - 在 PostgreSQL 容器启动时创建多个数据库
- ios - 如何使用视图自定义我的手势响应链:“可滑动”UITabBarController -> UIViewController -> PageViewController
- javascript - 结果不显示,怎么回事
- java - 如何在 Minecraft 1.12.2 模组中制作定向方块?
- modx - 如何制作条件“如果集合包含等于 [[*id]] 的电视资源”
- docker - 释放容器时Heroku CLI“没有为进程类型web指定命令”
- javascript - Tensorflowjs 在我们的 Web 应用程序浏览器中工作,但在移动 Web 浏览器中不工作