如果函数接收任意对象x
作为参数,那么测试x
是否支持某种方法foo
的最佳方法是什么?
(我认为,作为最后的手段,该函数总是可以尝试使用合适的处理程序来评估foo(x)
中的tryCatch
,但我发现,至少在某些情况下,{{{ 1}}即使foo(x)
不支持x
也不会产生错误;相反它只会返回foo
。因此,人们不能依赖捕获异常作为{的合适测试{1}} NULL
的支持。)
我认为这个问题的答案取决于x
"对象味道" (foo
,x
或其他)。请在答案中考虑所有这些可能性。
答案 0 :(得分:3)
有几种方法可以解决这个问题。
通过以下方式查找可用的方法:
methods(class = class(x))
测试foo
类的x
方法是否存在:
"foo" %in% methods(class = class(x))
如果您的方法未按包导出(并且只能通过package:::foo.bar(x)
bar
类x
访问),则上述示例中不会显示这些方法。< / p>
另见In R, how to find out which method is dispatched for a particular function call?
答案 1 :(得分:2)
您可能想要探索methods
的输出。例如
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")