有没有人放在一起/找到一个很好的方法来列出给定对象可用的所有 S3 方法?内置的methods()
函数将为指定的类或指定的泛型函数提供所有可用的方法,但不为对象提供。
我想到的一个例子是glm
对象,它是(次要?)类"glm"
,但也继承自"lm"
g <- glm(y~x,data=data.frame(x=1:10,y=1:10))
class(g)
## [1] "glm" "lm"
课程有35种方法&#34; lm&#34;和#34; glm&#34;。我对结合了
结果的答案感兴趣lapply(class(g),function(x) methods(class=x))
以明智的方式,以便我可以立即看到(例如)glm
具有add1
特定方法,但alias
的方法继承自lm
x$getRefClass()$methods()
班。
有人有光滑的方式来做这件事,还是已经存在?
PS史蒂夫沃克的S3-S4-reference class glossary表明这对于引用类是自动的,我们必须使用一个对象来获取方法({{1}})。
答案 0 :(得分:4)
这是一个至少会告诉你对象最初会触发哪种S3方法的函数:
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"
答案 1 :(得分:4)
这是尝试复制&#34;标准&#34;行为
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
个东西。