function to return all S3 methods applicable to an object

前端 未结 2 1536
慢半拍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: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.

提交回复
热议问题