【问题标题】:Using generic functions of R, when and why?使用 R 的泛型函​​数,何时以及为什么?
【发布时间】:2012-03-16 09:24:29
【问题描述】:

我正在对 R 包进行重大升级,作为更改的一部分,我想开始使用 S3 方法,这样我就可以使用通用绘图、汇总和打印功能。但我想我并不完全确定我理解为什么以及何时使用泛型函数。

例如,我目前有一个名为 logLikSSM 的函数,它计算状态空间模型的对数似然。除了使用这个函数,我可以创建函数 logLik.SSM 或类似的东西,因为 R 中有通用函数 logLik。这样做的好处是 logLik 比 logLikSSM 写起来更短,但真的还有其他点吗这个?

类似的情况,在 stats 包中有一个名为模拟的通用函数,所以理论上我可以使用它来代替模拟 SSM。但是现在模拟函数的描述告诉我们该函数是用来“模拟响应”的,但我的函数实际上是模拟隐藏状态,所以它真的不适合模拟函数的描述。所以可能在这种情况下我不应该使用泛型函数吗?

如果这个问题在这里太含糊,我深表歉意。

【问题讨论】:

    标签: r generics methods


    【解决方案1】:

    从 R 的核心为泛型创建方法的优点包括:

    1. 易于使用。已经熟悉这些泛型的包的用户将更少记住,从而更容易使用您的包。他们甚至可以在不阅读文档的情况下完成一定数量的工作。如果您想出自己的名字,那么他们必须发现并记住新名字,这会增加认知负担。

    2. 利用现有功能。此外,任何其他使用您为其创建方法的泛型的函数也可以自动使用您的;否则,它们将不得不改变。例如,AIC 使用 logLik

    缺点是泛型涉及额外的调度级别,如果logLik 处于优化的内部循环中,则可能会产生影响(尽管可能不重要)。在这种情况下,您可以检查调用泛型与直接调用方法的性能,如果有显着差异则使用后者。

    如果您的函数与 R 核心中的泛型具有完全不同的目的,那么它可能比有用更令人困惑,因此在这种情况下,您可能不会创建方法而是拥有自己的函数名称。

    您可能想阅读zoo Design manual(请参阅该页面底部附近的小插图下的zoo Design 链接),其中讨论了动物园包中的设计理念。其中包括这里讨论的想法。

    编辑:添加了缺点。

    【讨论】:

    • 谢谢,我确实想到了第一个优势,但我错过了第二点。关于优化和 logLik 的好点,必须测试。我也会查看动物园手册。
    【解决方案2】:

    好问题。

    我会将您的问题分为两部分;这是第一个:

    我在[使函数通用]方面真的还有其他意义吗?

    嗯,这种模式通常在开发人员不知道他/她希望用户传入的每个对象的对象类时被调用到所考虑的方法中。

    并且由于这种不确定性,这种设计模式(在许多其他语言中称为重载)被调用,它需要 R 评估对象类,然后 dispatch 该对象到给定对象类型的适当方法。

    您问题的第二部分:[i]在这种情况下,我不应该使用 [通用函数] 对吗?

    要尝试给您提供超出问题细节的有用答案,请考虑在您调用 setGeneric 时原始方法会发生什么,并传入该方法。

    原来的函数体被替换为根据传入的对象类型执行顶级调度的代码。这替换了原来的函数体,它只是向下滑动了一层,使其成为默认方法 顶级(通用)函数调度到的。

    showMethods() 将让您看到所有由新创建的调度函数(通用函数)调用的方法。

    【讨论】:

    • 谢谢,这让我更好地理解了泛型背后的原因。
    【解决方案3】:

    现在有一个巨大的缺点:

    易于误用: 已经熟悉这些泛型的包的用户可能会在不阅读文档的情况下完成一定的操作。

    其中存在这样一个谬论,即组件、可重用对象、服务等是所有软件挑战的灵丹妙药。

    以及为什么绝大多数软件存在漏洞、臃肿且运行不一致,而技术支持能够诊断您的问题的希望渺茫。

    在过去,静态链接和小型可执行文件是有原因的。但是这一代代码现在,现在得到报酬,如果有的话,以后再调试,在裁员/首次公开募股之前,已经不记得代码实际上非常可靠地工作并且安装/集成不需要 200 美元/小时 Big 4 顾问的日子或者黑客花了一周时间试图安装一些“简单”的开源产品并高效运行。

    但是,如果您想继续编写更短的函数/方法名称的传统,请成为我的客人。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-12-24
      • 1970-01-01
      • 2023-03-29
      相关资源
      最近更新 更多