如何使用plot函数绘制自己函数的结果?

Use*_*331 1 plot r function

我正在编写一个简短的 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 
Run Code Online (Sandbox Code Playgroud)

为了尝试制作一个可重现的示例:

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)
Run Code Online (Sandbox Code Playgroud)

所以使用plot(dat)我想得到与 相同的结果plot(dat$one, dat$two)。我还想添加一个可以设置为TRUE/ 的(新)参数FALSE

这可能吗?

Axe*_*man 5

我想你可能正在寻找课程。您可以使用 S3 系统来实现此目的。

对于您的survival示例,data有该类survfit(请参阅 参考资料class(data))。然后 usingplot(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)
}
Run Code Online (Sandbox Code Playgroud)

现在你的代码应该可以工作:

dat <- f(3, 2)
plot(dat)
Run Code Online (Sandbox Code Playgroud)

您可以放入任何plot.my_class您想要的东西,包括附加参数,只要您的第一个参数是x并且是my_class对象。

plot现在打电话plot.my_class,既然dat是上课my_class

您还可以添加其他方法,例如 for print

plot有许多不同的绘图函数可以为不同的类调用,请参见methods(plot)

另请参阅 Hadley 的Advanced R 书籍中有关 S3 的章节。