什么时候能在R编程中使用S4方法?

我在专业环境下定期在R编程,并为客户或同事编写软件包。 这里的一些程序员有一个Java背景,并坚持使用S4方法做所有面向对象的方法。 另一方面,我的经验是,S4的实现往往performance得更差,并且在试图让代码做你想做的事情时会引起更多的头痛。

我绝对同意,在某些情况下,您必须能够以受控方式构造复杂对象或追加现有对象。 但大多数情况下,S4实现可以很容易地使用经典列表来完成,而没有像定义标准generics,方法,构造函数,初始化程序等这样的麻烦。

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

编辑:为了清楚起见,我很欣赏答案和有关面向对象的一般讨论在OOP可以在R中以多种方式完成,但我的问题是真正针对使用S4方法的附加价值具体。

我假设这并不直接适用于你,但是如果你正在开发Bioconductor的软件包,那么就有积极的鼓励使用S4的激励,现在已经有十年多的时间了 – 所以所有的核心包大量使用S4。

我发现所有额外的开销是一个痛苦 – setGeneric,setMethod,处理NAMESPACE等等。据说,我发现它所强加的结构,可扩展性和其他这样的事情是值得的。 就像所有的事情一样,涉及到权衡。 我认为它可以更清洁 – 我不喜欢如何S3命名约定(foo.class)简单地伪装S3方法。 尽pipe如此,我倾向于避免在自己的代码中大量使用S4,除非我被告知这样做。

我的经验和你的一致,所以我专门用S3。

为了澄清:S4有一些光滑的function(例如,在多个参数上进行调度和插槽types检查),但是我没有遇到function超过成本的情况。 成本的例子包括:任何时隙更改需要完整的对象副本,并且(可能更糟)正在对S4方法进行的更改。

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

好问题! 我希望这会产生一些深思熟虑的讨论

我从来没有使用过,也不打算出于以下原因:

  1. 性能
  2. 我没有耐心去完全理解S4和S3的关系。
  3. 语法suguar:我宁愿有object.method()比方法(对象)。

我喜欢suguar,我能说什么!

我学习了S4,以扩展动物轨迹数据的空间(sp)类。 从可用选项中,这是最好的select(最一致,通用,与许多GIS定义紧密匹配),以避免从头开始编写所有需要的东西。 我不觉得S4像许多人所说的那样繁重,但是我现在习惯于探索像这样的对象的底层结构。 performance也不错,我认为可以做得很好,但是做得不好的话还是有性能陷阱的。

如果你感兴趣的是空间数据,spatstat就是一个很好的例子,说明如何在S3中做很多类似的事情,尽pipe(看起来像空间一样……)在不同软件中的数据结构之间几乎没有干净的类比。

S4类在空间统计学(sensu package sp )中扮演着重要angular色,从一种types的数据到另一种types的数据转换似乎是无缝的。 这个问题的缺陷在于debugging,根据我的经验,这是最好的。 到目前为止,我已经用S3来pipe理,但是可能会考虑在未来使用S4。

随着时间的推移,随着时间的推移,我相信他们至less在R的各个领域(可能是空间分析,计量经济学,环境…)的核心特征中扮演着强有力的angular色。

不要忘了还有R.oo(在CRAN上)提供了在R中执行OO的第三种方法。在我看来,这提供了一个OO系统,对于从其他系统迁移的程序员来说可能更为熟悉 – 特别是不使用generics函数(因此,print(foo)然后必须在foo的类上派发)方法绑定到对象,所以你会做foo $ print() – 就像在Python或C ++中,你会做foo.print ()。

曾几何时,Roxygen2不喜欢S4方法。 到2017年(至less),他们一起工作。

我不幸地创build了一些需要使用S3和S4类的方法的函数。 多年来,随着R-core多次改变了这些系统交互的细节,以及命名空间如何工作以及Rcmd检查如何工作,保持这些代码的工作已经非常令人难以置信。

如果你不喜欢谷歌的风格指南,那么从这个线程的R-help上考虑这些知名的R包开发者的意见

Frank Harrell“如果你喜欢计算机科学,而不是重视自己的时间,那就用S4吧。”

Terry Therneau写道:对于我所做的90%,我更强烈地喜欢松散的(S3)而不是刚性的(S4)类….我的S4与S3的总结

S4在以下方面有很大的增量:1.滋扰写2.debugging困难3.写非常模糊代码的能力4.devise

S4增益:5.指导自动转换的能力6.validation类对象的内容