r - 返回适用于对象的所有 S3 方法的函数

标签 r r-s3

是否有人整理/找到了列出可用于给定对象的所有S3方法的好方法?内置methods() function 将为指定的类或指定的泛型函数提供所有可用的方法,但不为对象提供所有可用的方法。

我想到的例子是 glm对象,属于(次要?)类 "glm"但也继承自"lm"

g <- glm(y~x,data=data.frame(x=1:10,y=1:10))
class(g)
## [1] "glm" "lm"

“lm”类有 35 个方法,“glm”类有 22 个方法。我对结合以下结果的答案感兴趣

lapply(class(g),function(x) methods(class=x))

以一种合理的方式,这样我就可以立即看到(例如)有一个 glm -add1的具体方法,但是 alias 的方法继承自 lm类。

是否有人有一种巧妙的方法来做到这一点,或者它已经存在?

PS 史蒂夫·沃克的 S3-S4-reference class glossary表明这对于引用类自动起作用,我们必须使用对象来获取方法( x$getRefClass()$methods() )。

最佳答案

这是复制“标准”行为的尝试

classMethods <- function(cl) {
    if(!is.character(cl)) {
        cl<-class(cl)
    }
    ml<-lapply(cl, function(x) {
        sname <- gsub("([.[])", "\\\\\\1", paste0(".", x, "$"))
        m <- methods(class=x)
        data.frame(
            m=as.vector(m), 
            c=x, n=sub(sname, "", as.vector(m)),
            attr(m,"info"),
            stringsAsFactors=F
        )
    })
    df<-do.call(rbind, ml)
    df<-df[!duplicated(df$n),]
    structure(df$m, 
        info=data.frame(visible=df$visible, from=df$from), 
        class="MethodsFunction")
}

然后你可以尝试一下

g <- glm(y~x,data=data.frame(x=1:10,y=1:10))
classMethods(g)
#or classMethods(c("glm","lm"))

然后就会返回

 [1] add1.glm*           anova.glm           confint.glm*        cooks.distance.glm*
 [5] deviance.glm*       drop1.glm*          effects.glm*        extractAIC.glm*    
 [9] family.glm*         formula.glm*        influence.glm*      logLik.glm*        
[13] model.frame.glm     nobs.glm*           predict.glm         print.glm          
[17] residuals.glm       rstandard.glm       rstudent.glm        summary.glm        
[21] vcov.glm*           weights.glm*        alias.lm*           case.names.lm*     
[25] dfbeta.lm*          dfbetas.lm*         dummy.coef.lm*      hatvalues.lm       
[29] kappa.lm            labels.lm*          model.matrix.lm     plot.lm            
[33] proj.lm*            qr.lm*              simulate.lm*        variable.names.lm* 

   Non-visible functions are asterisked

它不像 Josh 那样优雅或简短,但我认为它很好地重现了默认行为。有趣的是,methods 函数本身主要只是所有已知函数名称的 grep。我从那里借了 gsub 东西。

关于r - 返回适用于对象的所有 S3 方法的函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23840404/

相关文章:

r - 为什么 rbind() 工作而 bind_rows() 在组合这些 sf 对象时不起作用?

string - 识别与 R 中略有不同的字符串

r-package - R CMD 检查名称中带有点的非 S3 方法,其中点之前的部分名称与 utils 中的泛型一致

r - 分配 S3 子集运算符

r - 修改 S3 对象而不返回它?

R直方图导致空图

r - 有没有办法用 sparklyr 处理嵌套数据?

r - 创建名为 `Median` 的 S4 方法

用其他东西替换字符串中第 N 次出现的字符