【问题标题】:How to use plot function to plot results of your own function?如何使用绘图函数绘制自己函数的结果?
【发布时间】:2018-09-01 22:03:56
【问题描述】:

我正在编写一个包含函数的简短 R 包。该函数返回一个向量列表。我想使用 plot 函数来默认绘制一个用其中一些向量完成的图,添加线条并添加一个新参数。

例如,如果我使用 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

这可能吗?

【问题讨论】:

  • 没有dat$a,更没有plot$b,想要的结果图是什么,为什么像myplot &lt;- function(mydat) plot(dat[[1]], dat[[2]], ...)这样的自定义函数不能满足你?
  • 我的意思是 dat$one 和 dat$two (已经编辑),我知道如何制作自己的功能,但我想知道这是否可能(并且容易),因为我认为这是一个更直觉行为。
  • 试试plot(data.frame(dat[1:2]))

标签: r function plot


【解决方案1】:

我想你可能正在寻找课程。您可以为此使用 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 的 Advanced R book 关于 S3 的章节。

【讨论】:

    猜你喜欢
    • 2013-01-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-07
    • 2020-04-07
    • 2015-10-23
    • 2015-12-09
    相关资源
    最近更新 更多