如何测试对象是否有特定的方法?

时间:2017-01-20 11:48:56

标签: r oop

如果函数接收任意对象x作为参数,那么测试x是否支持某种方法foo的最佳方法是什么?

(我认为,作为最后的手段,该函数总是可以尝试使用合适的处理程序来评估foo(x)中的tryCatch,但我发现,至少在某些情况下,{{{ 1}}即使foo(x)不支持x也不会产生错误;相反它只会返回foo。因此,人们不能依赖捕获异常作为{的合适测试{1}} NULL的支持。)

我认为这个问题的答案取决于x"对象味道" (foox或其他)。请在答案中考虑所有这些可能性。

2 个答案:

答案 0 :(得分:3)

有几种方法可以解决这个问题。

通过以下方式查找可用的方法:

methods(class = class(x))

测试foo类的x方法是否存在:

"foo" %in% methods(class = class(x))

如果您的方法未按包导出(并且只能通过package:::foo.bar(x) barx访问),则上述示例中不会显示这些方法。< / 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")