R中的类:S3 vs S4

Roc*_*nce 52 r class s4

我想在R中创建一个类,我应该使用S3还是S4类?

我读了很多关于它们的不同的东西,有一个优于另一个吗?

Rei*_*son 60

S3只能调度它的第一个参数,而S4可以调度多个参数.如果你希望能够写一个函数的方法foo,如果给定类的一个对象,它应该做不同的事情"bar"或定类的对象"bar" "foobar",或定类的对象"barfoo""foobar",然后S4提供了一个更好的方式来处理这种复杂性.

S3非常简单且易于实现,但实际上并不是一个正式的面向对象系统.这种简单性是以强制属于类的对象具有正确的组件/插槽等为代价的.使用S3我可以做类似的事情class(obj) <- "lm",方法调度将"lm"在传递时使用类的方法obj,但不能保证obj真的是一个阶级的对象"lm".

S3易于实现,文档并且需要程序员更少的额外知识.

使用哪种只能是你可以决定的.例如,Doug Bates(2003)曾说过,对于新项目,他会使用S4而不是S3.我还没有必要使用除S3方法之外的任何东西.

所以我会坐下来思考你想要对这些类进行操作的各种类和方法.考虑一下您想要的功能,这可能会指向一个系统或另一个系统.

道格拉斯贝茨.将包转换为S4.R News,3(1):6-8,2003年6月

  • 它们在计算上是否可比?S4更快吗? (3认同)
  • 我认为 S3 可以快得多 - 通过将时间关键代码移植到 S3,我已经实现了 50 倍的加速。两个主要原因:a) 在 S3 中创建新的类成员几乎没有开销(可以只更改“类”属性)和 b) 如有必要,您可以选择通过编写例如 mean.Date(x) 而不是 mean 来避免方法调度开销(X)。但是很想听听是否有人对加速 S4 代码有任何建议。 (2认同)

mar*_*omo 7

参考类怎么样?它不是S3,有些人认为它在S4之上的语法糖,但它是很多糖.

举一个简短的例子,查看几个月前我问过的问题的答案.

我仍然需要找到如何为这些类编写Rd文件.

  • @RockScience:如果你想要参考类,你可以在这里阅读更多关于它们潜在用途的信息http://stackoverflow.com/questions/5137199/what-is-the-significance-of-the-new-reference-classes (3认同)