如何查看对象是否具有特定方法?

我想知道给定的对象是否有特定的方法.

例如,假设我想知道我的神秘对象是否具有特定的打印方法.从阅读方法,我尝试这样的事情:

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.

点赞