如何使用绘图功能绘制自己的函数结果?

时间:2018-03-23 09:18:25

标签: r function plot

我正在写一个包含一个函数的短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的(新)参数。

这可能吗?

1 个答案:

答案 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章节。