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