R 正在使用哪个plot()?

R 正在使用哪个plot()?,r,plot,R,Plot,在R中,您经常会看到plot()与不同类型的数据一起使用,默认结果也非常不同plot()识别给定的对象,并根据该对象使用适当的函数 在下面的示例中,plot()实际上指的是ape::plot.phylo() 库(ape) 正如其他人提到的,这与S3方法调度有关。您可以使用class功能检查对象的类别。在本例中,它返回phylo 许多泛型函数都有许多方法。您可以使用方法(“绘图”)检查所有方法 绘图功能的源代码为 function (x, y, ...) UseMethod("plot") 而

在R中,您经常会看到
plot()
与不同类型的数据一起使用,默认结果也非常不同
plot()
识别给定的对象,并根据该对象使用适当的函数

在下面的示例中,
plot()
实际上指的是
ape::plot.phylo()

库(ape)

正如其他人提到的,这与S3方法调度有关。您可以使用
class
功能检查对象的类别。在本例中,它返回
phylo

许多泛型函数都有许多方法。您可以使用
方法(“绘图”)
检查所有方法

绘图
功能的源代码为

function (x, y, ...) 
UseMethod("plot")
UseMethod
函数将搜索给定泛型函数的可用方法。如果它能找到方法,在本例中,它将执行该方法,否则将使用下一个方法或默认方法

因此,重申一下,
plot
使用的方法完全取决于对象的类别,而不是对象是数据帧、向量、列表等。 类可以方便地保证函数以预期的方式运行

为了真正说明问题,您也可以定义自己的绘图方法。以此为例:

plot.foo <- function(x){
      str(x)
      plot(iris)
}

obj1 <- 1:3
class(obj1) <- "foo"
obj2 <- list(x = 2, y = 1:100)
class(obj2) <- "foo"

#No matter the object we pass, so long as the class if "foo",
# our custom plot method is called

plot(obj1)
#Class 'foo'  int [1:3] 1 2 3
plot(obj2)
#List of 2
 #$ x: num 2
 #$ y: int [1:100] 1 2 3 4 5 6 7 8 9 10 ...
 # - attr(*, "class")= chr "foo"
plot.foo
plot()
是一个通用函数。
ape
包中有一个plot函数的方法,即
plot.phylo
。将包加载到R会话中时,每个泛型函数的任何方法都会缓存在您的环境中

m <- methods("plot")     
print(attr(m, "info"))  
如果尝试
methods(plot)
,您将看到环境中可用的所有
plot()
方法。这里有两条漂亮的线,用于查看环境中每个绘图方法的信息

m <- methods("plot")     
print(attr(m, "info"))  

如果给定对象没有方法所需的class属性,它将尝试函数的其他方法,最后尝试默认方法,在本例中为
plot。默认值

您可以检查用于CMO组合和函数的方法,G.Grothendieck实际上为此编写了一个很好的函数:
findMethod(plot,tree.owls)
在您的案例中。@jay.sf尝试给出以下错误:getGeneric(f,where=where)中的错误:参数“f”必须是字符串、泛型函数或基元:获取普通function@JordanHackett该消息似乎来自
methods::findMethod
。您应该使用链接答案中的函数覆盖该函数,或者使用新名称从该答案创建函数。这对我来说很有效,返回
[1]“plot.phylo”
@jordanhakett如果您提供一个最小的、自包含的、可复制的代码,我们可以更好地检查您的问题,请检查:@jay.sf谢谢。这在对象是S3的情况下非常有效。当对象是S4时似乎不起作用?例如:
库(MSnbase);数据(itraqdata);绘图(itraqdata[[1]]);findMethod(plot,itraqdata[[1]])
告诉我它正在运行
plot.default
,我怀疑它是否正确?