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

时间:2015-08-19 07:55:55

标签: r

我想知道给定的对象是否有特定的方法。 例如,假设我想知道我的神秘对象是否具有特定的print方法。从阅读?methods开始,我尝试这样的事情:

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只有一个类,这很好。如果它有多个,则methods中存在问题。我可以使用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

这会返回FALSE,因为没有print.mlm。但是,一个print.lm,而是使用它,所以我希望这会返回TRUE

作为一个对S3,S4等知之甚少的人,有一个&#34;正确的&#34;查看某个对象是否有“打印”的方法。任何类的方法?理想情况下,这适用于S3和S4对象,但我不知道这意味着什么。

我可以将我的methods(class=...)矢量化为class(mysteryObject),但我打赌这是一种更合适的方法......

1 个答案:

答案 0 :(得分:2)

在每个班级unlist上应用has.print <- function(object) { "print" %in% unlist( lapply( class(object), function(x) attr(methods(class = x), "info")$generic) ) } 并搜索&#34;打印&#34;:

print

可以从另一方开始(总共搜索一个班级 通用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"

找到方法:

show

S4

S4课程&#34;打印&#34;使用showDefault方法。如果不存在专门方法,则调用showMethods。函数show将显示是否有任何专门的library(Matrix) showMethods(f = "show", class = "denseMatrix") #> Function: show (package methods) #> object="denseMatrix"

例如:

showDefault

print也为非S4成员调用$sql = "SELECT * FROM table1"; $resultSet = odbc_exec($sqllink, $sql); while ($data = odbc_fetch_array($resultSet)) { $sql = "SELECT * FROM table2"; $resultSet2 = odbc_exec($sqllink, $sql);//failed here while ($data2 = odbc_fetch_array($resultSet2)) { //something here } }