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

use*_*035 3 r

所以我正在制作一个R包.在这个包中,我有一个函数foo1返回一个S3列表,其组件可以绘制.现在我有一个功能plotfoo1可以做到这一点.例如以下目前的工作原理:

output1<-foo1(Data)
plotfoo1(output1)
Run Code Online (Sandbox Code Playgroud)

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

plot(output1)
Run Code Online (Sandbox Code Playgroud)

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

Das*_*son 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)
Run Code Online (Sandbox Code Playgroud)