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
的类),则上述示例中不会显示这些方法


另见