在R中创建类:S3,S4,R5(RC)还是R6?

时间:2014-11-30 22:39:41

标签: r oop

我有点张贴一个开放的问题来寻找在R中创建新类的优点或缺点。据我所知,在R,S3,S4,R5中创建类时基本上有四种不同的范例(或RC)和R6。

S3是R使用的大多数核心库,并且似乎有一些优点可以坚持使用通用方法调度的简单,轻度结构化模式。我想避免将其用于我不太清楚的其他原因,例如封装,方法定义等。例如,在构造类时,它似乎相当麻烦,因为泛型方法是在阶级,以及那种性质的东西。

S4似乎没有任何好转,但确实有一个穷人关于它的类型安全概念,以犯明显可能出现的明显错误。但是,我仍然认为S4类很难维护,因为我不确定封装等内容以及这些类涉及的内容。另一件让我感到困惑的事情是,命名空间几乎没有概念。

R5似乎更像我习惯的,其中方法的定义绑定到类,而不是调度函数。在这里,我会更多地考虑使用我将习惯的类来组织对象。一个可能的缺点是R5也是由S4构建的。

R6似乎是个人重写的R5,它为混合添加了更多的OOP功能,例如私有和公共函数和属性,但是我很难找到对这些类的任何支持,因为有关它们的信息似乎通过谷歌搜索稀疏。

正如你所知,我正在努力研究R中的OO概念,我似乎无法弄清楚通常与OOP相关的以下方面:

  1. 类型安全/类型
  2. 方法/对象绑定,封装,成员变量等,
  3. 命名空间和组织代码
  4. 继承版本。
  5. 我想知道是否有人可以提供一个答案,可以描述R社区中首选的课程系统,以及如何最好地考虑何时使用课程。

1 个答案:

答案 0 :(得分:50)

您似乎已经了解了各种OOP类型的一些定义和用法。我会就何时适合使用它发表意见。

  1. 在以下两种情况适用的情况下使用S3类:(a)您的对象是静态的而不是自我修改的,以及(b)您不关心多参数方法签名,即您的方法纯粹在它的第一个参数,即对象的S3类上调度。此外,S3类是一个很好的解决方案,当你可以忍受这些限制,并希望超载许多运算符。

  2. 如果您的对象是静态的而不是自我修改的,则使用S4类,但您需要关注多参数方法签名。根据我的经验,S4 OOP一直比它的价值更麻烦,虽然它在某种程度上“保证”了类型安全。

  3. 如果您的对象是自修改的,请使用引用类。否则,您将不得不定义许多替换方法(例如,some_method<-,使用语法some_method(obj) <- value调用)。这很笨拙且计算速度慢,因为R每次都会创建对象的完整副本。 R6是一个很好的替代品,虽然我没有发现它对我的目的是必要的。

  4. 大多数R新手都认为它很混乱;有这么多OOP实施的原因是因为没有达成共识。

    这是不正确的。

    由于其统计性质,R中的大多数异构结构(即应该是对象的东西)最终成为统计算法的结果:lm,glmnet,gbm等对象。通常可以捆绑这些信息并提供预期的界面来汇总它:printsummary等。

    由于其作为统计操场的遗产,这使用户不必考虑更高级的概念,如继承和分配/解除分配,并为更多的贡献者打开了竞争环境。这意味着在R中创建复杂项目(例如,Web服务器,文本解析器,图形界面等)比在像Ruby这样的典型对象驱动语言中创建更麻烦,但缺乏统一的OOP类型是通过易用性来平衡。

    考虑它的最后一种方法是不同的方法就像物质中的相变:固体,气体,液体。不是一致地处理所有异质结构(即,类似OOP的东西),一些结构在一种结构下比另一种结构更自然地下降。如果我在S3类中包装一个简单的列表以便与重载的print方法很好地显示,那么为此目的设置一个完整的引用类将是相当愚蠢的。