我正在准备一个小的 r 包,我想在通过函数创建的对象上使用函数plot()
,并获得自定义绘图。例如,这是一个非常愚蠢的示例函数:
myfun <- function(x,y){
A <- B <- c()
for(i in 1:x) {
A[i] <- i^2
B[i] <- i^2+1}
return(list(A,B))
}
然后,我创建一个包含 2 个向量的列表:
obj <- myfun(5,6)
因此,获取绘图的标准方法是:
plot(x=obj[[1]],y=obj[[2]], main='my title',type = 'b', col='red)
但是,与其这样,我想运行以下内容:
plot(obj)
并得到相同的。所以我不知道如何将其编码到我的函数中以获得完全个性化的情节。另外,我想获得一个自定义的汇总表,例如,运行以下内容:
summary(obj)
能够获得带有平均值、sd 等的表。 我一直在StackOverflow上寻找这个,但没有成功,但也许我使用了错误的关键字。提前非常感谢。
如果你给你的myfun输出一个自定义类:
class(obj) <- 'myClass'
然后添加新的 s3 方法:
plot.myClass <- function(obj) {
plot(x=obj[[1]],y=obj[[2]], main='my title',type = 'b', col='red)
}
现在您可以使用:
plot(obj)
您需要定义一个类,然后创建自己的个人方法。
plot()
和summary()
是泛型函数。如果在主机上键入:
methods(plot)
methods(summary)
你会看到很多方法已经存在。
如果您在控制台上打印plot
,您将看到:
plot
#> function (x, y, ...)
#> UseMethod("plot")
#> <bytecode: 0x2363df0>
#> <environment: namespace:graphics>
plot
调用一个名为UseMethod
的函数,该函数将查找命名空间和与plot
相关的全局环境中可用的所有方法。
以这种方式编辑代码:
myfun <- function(x,y){
A <- B <- c()
for(i in 1:x) {
A[i] <- i^2
B[i] <- i^2+1}
structure(class = "myclass", list(A,B))
}
这样,您可以创建类。您的函数myfun()
将始终返回一个对象myclass
该对象是两个数字向量的列表。
现在,您可以创建自己的方法。方法应以泛型函数的相同名称开头,后跟一个点和类的名称。
plot.myclass <- function(obj, ...){
plot(x = obj[[1]], y = obj[[2]], main='my title', type = 'b', col = 'red', ...)
}
obj <- myfun(5,6)
plot(obj)
添加...
,以防将来要向绘图添加更多功能。
同样的东西summary
.例如,您可以对print
进行相同的操作。
PS:我强烈建议您在示例中使用lapply()
,vapply()
或purrr::map_dbl()
而不是for
循环。 并追求整洁的ggplot
而不是情节。
SmokeyShakeers 关于绘图的答案是正确的,但对于您的另一个问题,即能够获得带有平均值、sd 等的表格。 您需要将obj转换为数据框,然后运行摘要,以便能够获得所有这些统计信息。
summary(data.frame(x=obj[[1]],y=obj[[2]]))
x y
Min. : 1 Min. : 2
1st Qu.: 4 1st Qu.: 5
Median : 9 Median :10
Mean :11 Mean :12
3rd Qu.:16 3rd Qu.:17
Max. :25 Max. :26
编辑:或者为了保持一致,您可以执行以下操作:
summary.myClass <- function(obj){summary(data.frame(x=obj[[1]],y=obj[[2]]))}
summary(obj)