【问题标题】:class in R: S3 vs S4R类:S3 vs S4
【发布时间】:2011-06-23 07:37:53
【问题描述】:

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

我读了很多关于他们的不同的东西,有没有比另一个更好的?

【问题讨论】:

  • 它们是两个不同的概念。你想做什么?
  • 我想操作对象:创建它们,提取属性或槽,并最终为它们定义方法
  • 不得不说我更喜欢S4的objectName@attributeName而不是S3的attr(objectName, attributeName)
  • 就像我说的,S4 完全是另外一头野兽,并且认为它会让你的编程变得更容易,而不是成为我的客人。 :) 有关 S4 对象资源的讨论,请参阅 stackoverflow.com/questions/4143611/…
  • @RockScience:你不应该使用 objectName@attributeName,你应该有一个 getter 方法。始终尝试编写接口,而不是实现。

标签: class r s4


【解决方案1】:

S3 只能在它的第一个参数上分派,而 S4 可以在多个参数上分派。如果您希望能够为函数foo 编写方法,如果给定"bar" 类的对象或给定"bar" 类的对象 "foobar",或者给定"barfoo""foobar" 类的对象,那么 S4 提供了一种更好的方法来处理这些复杂性。

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

S3 易于实现、文档化,并且对程序员的额外知识要求较少。

使用哪个只能是您可以决定的。例如,Doug Bates (2003) 曾说过,对于新项目,他将使用 S4 而不是 S3。除了 S3 方法,我还没有需要使用任何其他方法。

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

道格拉斯·贝茨。 Converting packages to S4。 R 新闻,3(1):6-8,2003 年 6 月

【讨论】:

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

Reference Classes 呢?它不是 S3,有些人认为它是 S4 之上的语法糖,但它很多糖。

举个简短的例子,请查看this answers 来回答我几个月前在这里提出的问题。

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

【讨论】:

  • @RockScience:如果你想要参考类,你可以在这里阅读更多关于它们的潜在用途stackoverflow.com/questions/5137199/…
  • 酷。感谢您链接到您几个月前提出的问题:-)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-04-06
  • 1970-01-01
  • 2018-10-01
  • 2016-02-06
  • 2013-01-03
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多