R 如何测试对象是否有特定的方法?
如果函数接收任意对象R 如何测试对象是否有特定的方法?,r,oop,R,Oop,如果函数接收任意对象x作为参数,那么测试x是否支持某种方法foo的最佳方法是什么 (我认为,作为最后的手段,函数总是可以尝试使用合适的处理程序在tryCatch中计算foo(x),但我发现,至少在某些情况下,foo(x)即使x不支持foo,也不会产生错误;相反,它只会返回NULL。因此,不能依赖捕获异常作为对x支持foo的适当测试 我想这个问题的答案将取决于x的“对象风格”(S3,S4,或其他)。请在回答中考虑所有这些可能性。 您可能想探索方法的输出< /代码>。比如说 head(attr(me
x
作为参数,那么测试x
是否支持某种方法foo
的最佳方法是什么
(我认为,作为最后的手段,函数总是可以尝试使用合适的处理程序在tryCatch
中计算foo(x)
,但我发现,至少在某些情况下,foo(x)
即使x
不支持foo
,也不会产生错误;相反,它只会返回NULL
。因此,不能依赖捕获异常作为对x
支持foo
的适当测试
我想这个问题的答案将取决于
x
的“对象风格”(S3
,S4
,或其他)。请在回答中考虑所有这些可能性。 您可能想探索<代码>方法的输出< /代码>。比如说
head(attr(methods("print"), "info"))
visible from generic isS4
print.acf FALSE registered S3method for print print FALSE
print.anova FALSE registered S3method for print print FALSE
print.aov FALSE registered S3method for print print FALSE
print.aovlist FALSE registered S3method for print print FALSE
print.ar FALSE registered S3method for print print FALSE
print.Arima FALSE registered S3method for print print FALSE
对于一类对象是否存在方法,一个快速而肮脏的测试是
has_method <- function(class, method){
method_list <- methods(print)
method_list <- rownames(attr(method_list, "info"))
any(grepl(paste0(class, "$"), method_list))
}
has_method("stepfun", "print")
有几种方法可以实现这一点 通过以下途径查找可用的方法:
methods(class = class(x))
测试foo
方法是否存在于x
类中:
"foo" %in% methods(class = class(x))
如果您的方法不是通过包导出的(并且只能通过package:::foo.bar(x)
访问,其中bar
是x
的类),则上述示例中不会显示这些方法
另见