我正在写一个包含一个函数的短R包。该函数返回向量列表。我想使用绘图功能,以便默认绘制一些使用这些矢量完成的绘图,添加行并添加新参数。
例如,如果我使用survival
包,我可以得到以下内容:
library(survival)
data <- survfit(Surv(time, status == 2) ~ 1, data = pbc)
plot(data) # Plots the result of survfit
plot(data, conf.int = "none") # New parameter
为了尝试制作一个可重复的例子:
f <- function(x, y){
b <- x^2
c <- y^2
d <- x+y
return(list(one = b, two = c, three = d))
}
dat <- f(3, 2)
因此,使用plot(dat)
我希望与plot(dat$one, dat$two)
相同。我还想添加一个可以设置为TRUE
/ FALSE
的(新)参数。
这可能吗?
答案 0 :(得分:3)
我想你可能正在寻找课程。您可以使用S3系统。
对于您的survival
示例,data
包含课程survfit
(请参阅class(data)
)。然后使用plot(data)
将查找名为plot.survfit
的函数。这实际上是survival
包裹中未导出的功能,位于survival:::plot.survfit
。
您可以轻松地为您的包裹做同样的事情。例如,有一个创建类my_class
的对象的函数,然后为该类定义一个绘图方法:
f <- function(x, y){
b <- x^2
c <- y^2
d <- x+y
r <- list(one = b, two = c, three = d)
class(r) <- c('list', 'my_class') # this is the important bit.
r
}
plot.my_class <- function(x) {
plot(x$one, x$two)
}
现在您的代码应该可以运行:
dat <- f(3, 2)
plot(dat)
只要您的第一个参数为plot.my_class
并且是x
对象,您就可以在my_class
中添加任何内容,包括其他参数。
plot
现在调用plot.my_class
,因为dat
属于my_class
类。
您还可以添加其他方法,例如print
。
对于不同的类,可以使用plot
调用许多不同的绘图函数,请参阅methods(plot)
另见Hadley关于S3的Advanced R book章节。