使用R的泛型函数,何时以及为何?

时间:2012-03-16 09:24:30

标签: r generics methods

我正在开发一个R包的主要升级,作为更改的一部分,我想开始使用S3方法,所以我可以使用通用的绘图,摘要和打印功能。但我认为我并不完全确定我理解为什么以及何时使用泛型函数。

例如,我目前有一个名为logLikSSM的函数,它可以计算状态空间模型的对数似然。而不是使用这个函数,我可以使函数logLik.SSM或类似的东西,因为在R中有泛型函数logLik。这样做的好处是logLik写入比logLikSSM更短,但实际上还有其他任何一点。此?

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

如果这个问题在这里太模糊,我道歉。

3 个答案:

答案 0 :(得分:10)

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

  1. 易于使用。您已经熟悉这些泛型的软件包的用户将不再需要记住,以便更容易使用您的软件包。他们甚至可以在不阅读文档的情况下做一定的事情。如果你想出自己的名字,那么他们必须发现并记住新的名字,这会增加认知负担。

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

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

    关于你的函数与R的核心中的泛型完全不同的用途,那么它可能比有用的更令人困惑,因此在这种情况下,你可能不会创建一个方法但是有自己的函数名。

    您可能希望阅读zoo Design manual(请参阅该页面底部附近的Vignettes下的zoo Design链接),其中讨论了进入zoo包的设计构思。这些包括这里讨论的想法。

    编辑:增加了弱势群体。

答案 1 :(得分:4)

好问题。

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

我在[使函数通用]中还有其他任何一点吗?

嗯,当develper不知道他/她希望用户将传递给所考虑的方法的每个对象的对象类时,通常会调用此模式

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

你问题的第二个部分: [i]在这种情况下,我不应该使用[通用功能]吗? < / p>

要尝试给出一个超出问题详细信息的答案,请考虑在调用 setGeneric 时传递该方法时原始方法会发生什么。

原始函数体被代码替换,用于根据传入的对象类型执行顶级调度。这将替换原始函数体,它只滑下一个级别,使其成为默认方法< / em>顶级(通用)函数调度到。

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

答案 2 :(得分:1)

现在有一个巨大的劣势:

轻松 MISUse : 您已经熟悉这些泛型的软件包的用户可能会在不阅读文档的情况下做一定的操作。

其中存在的缺点是组件,可重用对象,服务等是解决所有软件挑战的灵丹妙药。

为什么绝大多数软件都是错误的,臃肿的,并且操作不一致,对技术支持能够诊断问题的希望渺茫。

当天有一个静态链接和小型可执行文件的原因。但现在这一代代码,现在得到报酬,如果有的话,在裁员/ IPO到来之前进行调试,对代码实际工作非常可靠并且安装/集成不需要200美元/小时的记忆没有记忆4名顾问或黑客,他们花了一周时间试图获得一些简单的&#34;安装了开源产品并高效运行。

但是如果你想继续写下更短的功能/方法名称的传统,那就做我的客人。