【问题标题】:Determine which function is called by a generic function确定泛型函数调用哪个函数
【发布时间】:2010-12-19 15:14:27
【问题描述】:

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

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

这不是一个普通的情节,它是为Kest() 对象构建的情节。因此,为了找到使用的功能进行调查,我会这样做:

class(K)

我明白了

"fv" "data.frame"

我猜是plot.fv

?plot.fv

是的!但我确信有比猜测更有效的方法。有人吗?

【问题讨论】:

    标签: r


    【解决方案1】:

    您可以使用 methods() 找到 S3 类的所有相应通用函数。所以在你的情况下:

    methods(class=fv)
    

    【讨论】:

    • @eytan:函数methods实际上在utils包中,而不是方法包中。
    • Marek 的答案确实是我想要的,但我喜欢你的提议的简单和优雅,即使它需要一些手动挖掘。
    【解决方案2】:

    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")
    

    【讨论】:

      【解决方案3】:

      在这种情况下,我们正在处理一个 S3 类。 (这是较旧的、更简单的面向对象风格。)这意味着当您为类 "fv" "data.frame" 的对象键入 plot(K) 时,R 会执行以下操作:

      它通过搜索路径查找名为plot 的函数。键入 search() 以查看 R 的位置。假设你没有做过像定义你自己的绘图函数这样愚蠢的事情,它应该在 graphics 包中找到版本。

      这个函数有一些特殊的逻辑来处理x是一个函数的输入,然后调用UseMethod

      UseMethod 在 serach 路径上查找名为 plot.fv 的函数,如果找到就调用它。

      如果失败,它会寻找plot.data.frame

      如果失败,它会寻找plot.default

      如果找不到,则会引发错误。 (虽然 plot.default 存在于图形包中,所以你必须非常努力地在这里得到错误。)

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-11-30
        相关资源
        最近更新 更多