gpt4 book ai didi

r - 如何查看一个对象是否有特定的方法?

转载 作者:行者123 更新时间:2023-12-01 03:39:09 26 4
gpt4 key购买 nike

我想知道给定对象是否具有特定方法。
例如,假设我想知道我的神秘对象是否有特定的 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

但是,如果我有多个类但第一个没有打印方法,则返回 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 等知之甚少的人, 是否有一种“正确”的方法来查看对象是否在其任何类上具有“打印”方法? 理想情况下,这适用于 S3 和 S4 对象,尽管我不知道这意味着什么。

我可以矢量化我的 methods(class=...)超过 class(mysteryObject) ,但我敢打赌有更合适的方法来做到这一点......

最佳答案

申请 methods在每节课上,unlist并搜索“打印”:

has.print <- function(object) {
"print" %in%
unlist(
lapply(
class(object),
function(x) attr(methods(class = x), "info")$generic)
)
}

可以从另一边开始(在所有搜索一个类
通用 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"

S4

S4 类使用 show “打印”方法。如果不存在专门的方法, showDefault叫做。功能 showMethods将显示是否有任何专门的 show :

例如:
library(Matrix)
showMethods(f = "show", class = "denseMatrix")

#> Function: show (package methods)
#> object="denseMatrix"
showDefault也调用 print对于非 S4 成员。

关于r - 如何查看一个对象是否有特定的方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32089651/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com