是否有人整理/找到了列出可用于给定对象的所有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/