我想知道如何快速找到特定对象的泛型函数调用的特定函数。示例:
library(spatial)
data(redwood)
K <- Kest(redwood)
plot(K)
这不是通常的情节,它是Kest()
对象的情节构建。因此,为了找到所使用的函数进行调查,我做了:
class(K)
我得到了
“fv”“data.frame”
我猜是plot.fv
?plot.fv
是的!但我确信有一种比猜测更有效的方法。任何人?
答案 0 :(得分:3)
您可以使用methods()找到S3类的所有相应泛型函数。所以在你的情况下:
methods(class=fv)
答案 1 :(得分:1)
UseMethod
的帮助中明确说明了这一点。
当一个函数调用
UseMethod("fun")
应用于具有类属性c("first", "second")
的对象时,系统会搜索一个名为fun.first
的函数,如果找到它,则将其应用于该对象。如果没有找到这样的函数,则尝试使用名为fun.second
的函数。如果没有类名生成合适的函数,则使用函数fun.default
(如果存在)或导致错误。
因此,如果您正在寻找合适的功能,您需要检查所有可能性,例如:
fun_seeker <- function(obj,fun) {
funs_to_check <- paste(fun,c(class(obj),"default"),sep=".")
funs_exists <- funs_to_check %in% methods(fun)
if (any(funs_exists)) funs_to_check[funs_exists][1] else stop("No applicable method")
}
fun_seeker(matrix(rnorm(100),10),"plot")
fun_seeker(matrix(rnorm(100),10),"summary")
答案 2 :(得分:0)
在这种情况下,我们正在处理S3类。 (这是较旧的,更简单的面向对象的样式。)这意味着当您为类plot(K)
的对象键入"fv" "data.frame"
时,R会执行以下操作:
通过搜索路径查找名为plot
的函数。输入search()
以查看R的外观。假设您没有像定义自己的绘图函数那样愚蠢,它应该在graphics
包中找到该版本。
这个函数有一些特殊的逻辑来处理x
是函数的输入,然后调用UseMethod
。
UseMethod
在serach路径上查找名为plot.fv
的函数,并在找到它时调用它。
如果失败,它会查找plot.data.frame
。
如果失败,它会查找plot.default
。
如果找不到,则会抛出错误。 (虽然图形包中存在plot.default
,但您必须非常努力才能在此处收到错误。)