function to return all S3 methods applicable to an object

前端 未结 2 1517
慢半拍i
慢半拍i 2021-01-12 23:11

Has anyone put together/found a good method for listing all the S3 methods available for a given object? The built-in methods() funct

相关标签:
2条回答
  • 2021-01-12 23:13

    Here's a function that will at least tell you which S3 methods an object will initially trigger:

    findMethodsS3 <- function(object) {
        x <- unlist(lapply(class(object),function(x) methods(class=x)))   
        sort(x[!duplicated(tools::file_path_sans_ext(x))])
    }
    
    findMethodsS3(g)
    #  [1] "add1.glm"           "alias.lm"           "anova.glm"         
    #  [4] "case.names.lm"      "confint.glm"        "cooks.distance.glm"
    #  [7] "deviance.glm"       "dfbeta.lm"          "dfbetas.lm"        
    # [10] "drop1.glm"          "dummy.coef.lm"      "effects.glm"       
    # [13] "extractAIC.glm"     "family.glm"         "formula.glm"       
    # [16] "hatvalues.lm"       "influence.glm"      "kappa.lm"          
    # [19] "labels.lm"          "logLik.glm"         "model.frame.glm"   
    # [22] "model.matrix.lm"    "nobs.glm"           "plot.lm"           
    # [25] "predict.glm"        "print.glm"          "proj.lm"           
    # [28] "qr.lm"              "residuals.glm"      "rstandard.glm"     
    # [31] "rstudent.glm"       "simulate.lm"        "summary.glm"       
    # [34] "variable.names.lm"  "vcov.glm"           "weights.glm"    
    
    0 讨论(0)
  • 2021-01-12 23:35

    Here's an attempt to replicate the "standard" behavior

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

    And then you can try it out with

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

    and that will return

     [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
    

    It's not as elegant or short as Josh's, but I think its a good recreation of the default behavior. It's funny to see that the methods function is itself mostly just a grep across all known function names. I borrowed the gsub stuff from there.

    0 讨论(0)
提交回复
热议问题