Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Oop 在R编程中使用S4方法何时有回报_Oop_R_Methods_S4 - Fatal编程技术网

Oop 在R编程中使用S4方法何时有回报

Oop 在R编程中使用S4方法何时有回报,oop,r,methods,s4,Oop,R,Methods,S4,我经常在专业环境下用R编程,我也为客户或同事编写软件包。这里的一些程序员有Java背景,坚持使用S4方法以面向对象的方式完成所有工作。另一方面,我的经验是,S4实现在试图让代码执行您希望它执行的操作时,通常执行得更差,并且会引起更多的头痛 我完全同意,在某些情况下,您必须能够以可控的方式构造复杂对象或附加现有对象。但大多数时候,S4实现也可以使用经典列表轻松完成,而无需定义standardGeneric、方法、构造函数、初始值设定项等麻烦 你认为什么时候写r?< /p>的S4实现? 编辑:为了清

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

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

<>你认为什么时候写r?< /p>的S4实现?
编辑:为了清晰起见,我非常欣赏R中关于OO的回答和一般讨论。OOP可以在R中以多种方式进行,但我的问题实际上是专门针对使用S4方法的附加值

我的经验与你的一致,所以我只使用S3

澄清一下:S4有一些灵活的特性(例如,多参数调度和插槽类型检查),但我没有遇到过这些特性超过成本的情况。成本的示例包括:任何插槽更改都需要完整的对象副本,以及(可能更糟的)对S4方法的持续更改


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

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

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

  • 演出
  • 我没有耐心完全理解S4及其与S3的关系
  • 语法suguar:我宁愿使用object.method()而不是method(object)

  • 我喜欢suguar,我能说什么呢

    S4类在空间统计(sensu package
    sp
    )中发挥着重要作用,从一种类型的数据转换到另一种类型的数据似乎是无缝的。这其中的陷阱是调试,根据我的经验,调试充其量是乏味的。 到目前为止,我已经用S3进行了管理,但是将来可能会考虑使用S4。
    随着时间的推移,随着事情的不断发展,我相信它们至少会在R的各个领域(可能是空间分析、经济计量学、环境计量学……)的核心特征中发挥重要作用这提供了在R中执行OO的第三种方法。在我看来,这提供了一个OO系统,从其他系统迁移过来的程序员可能更熟悉它——特别是,它没有通用函数(这样print(foo)就必须在foo类上调度),方法与对象绑定,所以您可以执行foo$print()就像Python或C++一样,你会做fo.PrdTo(./P>< P>)。我假设这并不能直接应用到你,但是如果你正在开发BioDeCs的包,那么就有动机使用S4,因为它们积极鼓励它的使用,现在已经有了十年的时间了。所以所有的核心包都大量使用S4。
    我发现所有额外的开销都很痛苦——setGeneric、setMethod、处理名称空间等等。尽管如此,我发现它强加的结构、可扩展性的潜力以及其他类似的东西都是值得的。与所有事情一样,这涉及到权衡。我认为它可以更干净-我不喜欢S3方法仅仅通过命名约定(foo.class)来伪装。尽管如此,我倾向于避免在自己的代码中大量使用S4,除非有人告诉我这样做。

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


    如果您对空间数据感兴趣,spatstat是一个很好的例子,说明了如何在S3中做许多类似于sp的事情,尽管(就像所有空间的东西一样…)不同软件中的数据结构之间几乎没有清晰的相似性。

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

    我不幸地创建了一些函数,这些函数需要方法来处理S3和S4类。多年来,由于R-core多次更改了有关这些系统如何交互、名称空间如何工作以及Rcmd检查如何工作的详细信息,因此保持此代码正常工作是非常痛苦的

    如果你不喜欢谷歌的风格指南,那么考虑一下这些著名的R包开发人员在

    上的评论。 弗兰克·哈雷尔 “如果你热爱计算机科学胜过珍惜自己的时间,请使用S4。”

    Terry Therneau写道: 对于我所做的90%,我非常喜欢松散(S3)类而不是僵硬(S4)类…我对S4与S3的总结

    S4在以下方面有较大的增量: 1.讨厌的写作 2.调试困难 3.能够编写非常晦涩的代码 4.设计

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

    我也不使用S4,因为我喜欢
    object.method()
    。谷歌的R风格表示:“除非有很强的理由使用S4对象或方法,否则使用S3对象和方法。S4对象的主要理由是在C++代码中直接使用对象。S4通用/方法的主要理由是在两个参数上调度:”FWW,为什么谷歌是R样式的权威?R-core不应该是这个问题的更高权威吗?(并不是说R-core在这个问题上的观点是一致的,bu