在s3对象上分派s4方法

时间:2018-07-19 16:38:01

标签: r

我最近错误地为s3类定义了s4方法。例如:

> foo <- structure(list(a=1),class='Bar')

然后定义这样的s4方法

> setMethod('show','Bar',function(object) cat('-->',object$a,'\n'))
in method for 'show' with signature '"Bar"': no definition for class "Bar"

您会收到警告,但其他情况似乎还可以。然后

> show(foo)
--> 1 

具有预期的行为。为什么这样做?

1 个答案:

答案 0 :(得分:2)

“为什么”问题可能很难凭权威回答,因为大多数语言的设计者都不会看到这个问题。如果将其发布在R-devel邮件列表中,则可能有需要的权限才能解决。我的看法是,R和S在功能上主要集中于此之前,因此将对象称为“ S4”并不是真正想要的。这些方法(函数)原本应被称为S3或S4,而S4方法原本应与命名类一起使用,因此对于那些具有原本应与S3方法一起使用的类的对象,应该可以成功。换句话说,从来没有意图在由类最初是由S3方法创建还是使用而定义的类之间建立清晰的分界线。

我也想到了一个稍微平凡/浮躁的答案。如果您使用的代码引发了错误,则setMethod的帮助页面也将引发错误,并且methods软件包将不会编译,并且不会是R的当前版本。那是因为相同的排序代码行显示在该帮助页面中的第一行可执行文件中,并引发相同的警告。

?setMethods页中警告您:

  

如果需要与旧类('S3')兼容,也可以使用它们,但是如果您希望S3样式继承能够正常工作,则必须通过调用setOldClass来声明这些类。