我定期在专业环境中使用 R 进行编程,也为客户或同事编写程序包。这里的一些程序员有 Java 背景,坚持使用 S4 方法以面向对象的方式完成所有事情。另一方面,我的经验是,S4 实现通常性能更差,并且在尝试让代码执行您希望它执行的操作时会引起更多头痛。

我绝对同意,在某些情况下,您必须能够以受控方式构造复杂对象或附加现有对象。但大多数时候,S4 实现也可以使用经典列表轻松完成,而无需定义 standardGeneric、方法、构造函数、初始值设定项等麻烦。

您什么时候考虑为 R 编写 S4 实现?

编辑 :为了清楚起见,我确实很欣赏 R 中关于 OO 的答案和讨论。在 R 中可以通过多种方式完成 OOP,但我的问题实际上是针对专门使用 S4 方法的附加值。

有帮助吗?

解决方案

我假设这并不直接适用于你,但如果你正在开发包Bioconductor的有使用S4,因为他们积极鼓励它的使用和拥有了十年的大部分时间,现在的激励 - 使所有芯包的大量使用S4的。

我觉得所有的额外开销是一个痛苦 - 在setGeneric,使用setMethod,涉及到命名空间,等等。话虽这么说,我觉得结构,它规定,可扩展性和其他类似的东西潜力是值得的。正如一切,也有涉及权衡。我认为它可以有很多清洁 - 我不喜欢怎么S3方法是简单地命名约定(让Foo.class)伪装。所有这一切是说,我倾向于避免在自己的代码大量使用S4除非我被告知这样做。

其他提示

我的经验是与你的线,所以我用S3只。

要澄清:S4有一些光滑特征(例如在多个参数和槽类型检查调度),但是我没有遇到的情况下的特征大于成本。成本的例子包括:任何时隙改变需要一个完整的对象复制和(可能更糟)正在进行的改变S4方法

总之,我喜欢背后S4的想法,但我会等待它在我自己的代码中使用它之前成熟。

好问题!我希望它能引起一些深思熟虑的讨论......

我从未使用过它,也不打算使用它,原因如下:

  1. 表现
  2. 我没有耐心完全理解S4以及它与S3的关系。
  3. 语法糖:我宁愿使用 object.method() 而不是 method(object)。

我喜欢糖,我还能说什么!

我为了延长空间(SP)类动物轨道数据了解到S4。这是最好的选择从可用的选项从头需要避免写的一切(最稳定的,一般和紧密匹配许多GIS定义)。我不觉得S4的繁重,很多人说,但现在我已经习惯了探索这样的对象的底层结构。性能也很好,我觉得可以做得很好,但做不好的时候也有性能陷阱。

如果空间数据是你的兴趣,spatstat是如何做了很多类似的事情,SP在S3中,虽然一个很好的例子(如看似一切空间。)有数据结构之间几乎没有干净的类比在不同的软件。

S4类在空间统计(意义上包sp)发挥强有力的一部分,从一种类型的数据转换到另一地方显得无缝的。这样做的缺陷是调试,这一直是我的经验,乏味的最好的。 到目前为止,我已经与S3管理,但可以考虑在未来使用S4。

随着时间的推移,事情变得周围有很多发挥,我相信他们将在至少由R的各个领域的核心功能很强的作用(这可能是空间分析,计量经济学,environmetrics ...)

不要忘记也有R.oo(CRAN上),它提供了R.做OO在我的脑海里的第三条道路,这提供一个面向对象的系统,该系统可能是程序员从其他系统迁移更熟悉 - 尤其是代替具有通用功能(使打印(富),然后必须在类Foo的调度)的方法是联系在一起的对象,所以你会做FOO $打印() - 就像在Python或C ++,你会怎么做foo.print()。

从前,Roxygen2不喜欢S4的方法。由于2017年(至少),它们一起工作。

我已经创建需要具有两个S3和S4的类的方法来工作的一些功能的不幸。它一直是令人难以置信的痛苦,以保持该代码多年来担任R型铁芯具有上多次改变细节如何将这些系统的交互,以及如何命名空间的工作,以及如何RCMD检查工作。

如果你不喜欢谷歌的风格指南,然后再考虑这些知名[R包开发者的意见,从这个线程上的 R-帮助

弗兰克勒尔 “如果你喜欢计算机科学比你更珍惜自己的时间,使用S4。”

特里Therneau写道: 对于90%的我做什么我强烈希望的松(S3),而不是刚性(S4)类....我S4的摘要VS S3

S4具有在大增量: 1.滋扰写 2.难以调试 3.写得很晦涩代码的能力 4.设计

S4收获: 5.以引导自动转换能力 6.验证一个类对象的内容

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top