我想知道给定的对象是否有特定的方法.
例如,假设我想知道我的神秘对象是否具有特定的打印方法.从阅读方法,我尝试这样的事情:
has.print <- function (mysteryObject) {
'print' %in% attr(methods(class=class(mysteryObject)), 'info')$generic
}
m <- lm(Sepal.Length ~ Species, iris)
class(m) # 'lm'
has.print(m)
如果mysteryObject只有一个类,这很好.如果它有多个,则方法存在问题.我可以通过使用class(mysteryObject)[1]解决这个问题,所以(例如)
library(data.table)
class(test) # data.table, data.frame
test <- data.table(iris)
has.print(test) # TRUE since there's a print.data.table
但是,如果我有多个类但第一个没有print方法,则返回false.例:
mlm <- lm(cbind(Petal.Length, Petal.Width) ~ Species, iris)
class(mlm) # 'mlm', 'lm'. Note there is no print.mlm but there's a print.lm
has.print(mlm) # FALSE
由于没有print.mlm,因此返回FALSE.但是,有一个print.lm,而是使用,所以我希望这返回TRUE.
作为一个对S3,S4等知之甚少的人,有一种“正确”的方式来查看某个对象是否在其任何类上都有“print”方法?理想情况下,这适用于S3和S4对象,但我不知道这意味着什么.
我可以在类(mysteryObject)上向我的方法(class = …)进行矢量化,但我敢打赌,有一种更合适的方法可以做到这一点……
最佳答案 在每个类上应用方法,取消列表并搜索“print”:
has.print <- function(object) {
"print" %in%
unlist(
lapply(
class(object),
function(x) attr(methods(class = x), "info")$generic)
)
}
可以从另一边开始(总共搜索一个类
通用打印功能):
has.print <- function(object) {
any( sprintf("print.%s", class(object)) %in%
rownames(attr(methods(generic.function = "print"), "info")))
}
要找到方法:
which.print <- function(object) {
print_methods <- rownames(attr(methods(generic.function = "print"), "info"))
print_methods[print_methods %in% sprintf("print.%s", class(object))]
}
# > which.print(mlm)
# [1] "print.lm"
S4
S4类用show方法“打印”.如果不存在专门方法,则调用showDefault.函数showMethods将显示是否有任何专门的节目:
例如:
library(Matrix)
showMethods(f = "show", class = "denseMatrix")
#> Function: show (package methods)
#> object="denseMatrix"
showDefault也为非S4成员调用print.