我想知道给定的对象是否有特定的方法。
例如,假设我想知道我的神秘对象是否具有特定的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)
,但我打赌这是一种更合适的方法......
答案 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课程&#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
}
}
。