如何在自己的R包中覆盖plot.default函数?

3

我正在制作一个 R 包。在这个包中,我有一个名为 foo1 的函数,它返回一个可以绘制其组件的 S3 列表。现在我有一个名为 plotfoo1 的函数来实现这一点。例如,以下内容目前有效:

output1<-foo1(Data)
plotfoo1(output1)

现在我的问题是,我想覆盖R中的plot函数,以便以下内容将产生相同的输出:
plot(output1)

但我不知道如何做到这一点。我正在寻找一个(链接?)来解释如何做到这一点。好像许多软件包都有自己的自定义绘图函数,所以应该是可能的...

1个回答

7

你不想覆盖 plot.default - 那将是一个可怕的想法。相反,你应该让 foo1 返回一个具有你创建的类的对象,并为该类类型编写 S3 绘图方法。以下是一个例子:

foo1 <- function(){
  dat <- data.frame(x = 1:10, y = rnorm(10))
  # Give the data a class
  class(dat) <- "myclass"
  return(dat)
}

# Write plot function for objects that
# have class "myclass"
plot.myclass <- function(obj, ...){
  plot.default(obj$x, obj$y)
}

mydata <- foo1()
# See - it has class "myclass"
class(mydata)
# plot recognizes that mydata has class "myclass"
# and calls plot.myclass on mydata automatically
plot(mydata)

非常好--虽然作为一个脾气暴躁的老头,我应该给你-1,因为你在可以被误读为“傻瓜”的地方使用了1而不是“foo-one” :-) - Carl Witthoft
@CarlWitthoft,我的回答这个问题的目的就是想说你是个傻瓜,这样 -1 才是应得的。 - Dason
1
@CarlWitthoft 我同情那些犯了这样错误的人。 pity the foo1 - joran
这太棒了!谢谢。 - user189035

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接