如何在属于包的 R 函数内自定义绘图?



我正在准备一个小的 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)

最新更新