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

时间:2014-08-19 14:57:47

标签: r

所以我正在制作一个R包。在这个包中,我有一个函数foo1,它返回一个S3列表,其组件可以被绘制。现在我有一个函数plotfoo1就可以做到这一点。例如。以下目前有效:

output1<-foo1(Data)
plotfoo1(output1)

现在我的问题。我想覆盖R中的绘图函数,以便以下将产生相同的输出:

plot(output1)

但我不知道该怎么做。我正在寻找(一个链接?)解释如何做到这一点。它应该是可能的,因为似乎很多包都有自己的自定义绘图功能...

1 个答案:

答案 0 :(得分:6)

您不想覆盖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)