确定泛型函数调用哪个函数

时间:2009-11-23 20:31:28

标签: r

我想知道如何快速找到特定对象的泛型函数调用的特定函数。示例:

library(spatial)
data(redwood)
K <- Kest(redwood)
plot(K)

这不是通常的情节,它是Kest()对象的情节构建。因此,为了找到所使用的函数进行调查,我做了:

class(K)

我得到了

  

“fv”“data.frame”

我猜是plot.fv

?plot.fv

是的!但我确信有一种比猜测更有效的方法。任何人?

3 个答案:

答案 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,但您必须非常努力才能在此处收到错误。)