代码之家  ›  专栏  ›  技术社区  ›  Joris Meys

在R编程中使用S4方法什么时候有回报

  •  67
  • Joris Meys  · 技术社区  · 14 年前

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

    我完全同意,在某些情况下,您必须能够以可控的方式构造复杂对象或附加现有对象。但是大多数时候,S4的实现也可以很容易地使用经典列表来完成,而不需要像定义standardGeneric、方法、构造函数、初始化器之类的麻烦。

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

    编辑:为了清晰起见,我非常欣赏R中关于OO的回答和讨论。OOP可以在R中以多种方式进行,但我的问题实际上是针对具体使用S4方法的附加值。

    7 回复  |  直到 13 年前
        1
  •  25
  •   geoffjentry    14 年前

    我假设这不直接适用于你,但如果你正在开发生物导体的封装,有一个动机使用S4,因为他们积极鼓励它的使用,并已为十年的大部分时间-所以所有的核心封装大量使用S4。

    我发现所有额外的开销都是一个难题——setGeneric、setMethod、处理名称空间等等。也就是说,我发现它强加的结构、潜在的可扩展性和其他类似的东西都是值得的。与所有事情一样,这也涉及到权衡。我认为它可以更干净-我不喜欢S3方法如何简单地通过命名约定来伪装(食品类). 尽管如此,我倾向于避免在自己的代码中大量使用S4,除非别人告诉我这样做。

        2
  •  27
  •   Joshua Ulrich    14 年前

    澄清一下:S4有一些巧妙的特性(例如,多参数调度和时隙类型检查),但是我没有遇到特性超过成本的情况。成本的例子包括:任何槽的更改都需要一个完整的对象副本,并且(可能更糟)正在进行的对S4方法的更改。

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

        3
  •  9
  •   Jeff    14 年前

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

    1. 性能
    2. 我宁愿对象.方法()方法(对象)。

        4
  •  9
  •   mdsumner    14 年前

    为了扩展动物轨迹数据的空间(sp)类,我学习了S4。它是从可用选项中选择的最佳选项(最一致、最通用且与许多GIS定义紧密匹配),以避免从头开始编写所需的所有内容。我不觉得S4像很多人说的那样繁重,但我现在习惯于探索像这样的物体的底层结构。表现也不错,我觉得可以做得很好,虽然做得不好也有表现陷阱。

    如果您对空间数据感兴趣,那么spatstat是一个很好的例子,说明了如何在S3中执行许多与sp类似的操作(就像所有看似空间的东西一样……)不同软件中的数据结构之间几乎没有清晰的相似之处。

        5
  •  6
  •   Roman LuÅ¡trik    14 年前

    S4类在空间统计(sensu)中扮演着重要的角色 sp ),从一种数据类型到另一种数据类型的转换似乎是无缝的。这其中的陷阱是调试,以我的经验来看,调试充其量是乏味的。 到目前为止,我已经使用了S3,但将来可能会考虑使用S4。

        6
  •  5
  •   Spacedman    14 年前

    别忘了还有R.oo(在CRAN上),它提供了在R中执行oo的第三种方法。在我看来,这提供了一个oo系统,对于从其他系统迁移过来的程序员来说可能更为熟悉——特别是没有通用函数(这样print(foo)就必须在foo类上调度),方法与对象绑定,所以你会做Fo$PrimeTo()——就像Python或C++一样食品印刷().

        7
  •  4
  •   Kevin Wright    8 年前

    我不幸地创建了一些函数,这些函数需要同时使用S3和S4类的方法。多年来,让这段代码继续工作是非常痛苦的,因为R-core已经多次更改了这些系统如何交互、名称空间如何工作以及Rcmd check如何工作的细节。

    如果你不喜欢Google的风格指南,那么考虑一下这些著名的R包开发人员的评论 R-help

    弗兰克·哈雷尔

    特里·塞尔诺写道:

    1讨厌的写作 2调试困难 三。能够编写非常晦涩的代码 4设计

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