Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/66.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
使用R的泛型函数,何时以及为什么?_R_Generics_Methods - Fatal编程技术网

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

使用R的泛型函数,何时以及为什么?,r,generics,methods,R,Generics,Methods,我正在开发一个对R包的主要升级,作为更改的一部分,我想开始使用S3方法,这样我就可以使用通用的绘图、摘要和打印功能。但我想我不能完全确定我是否理解为什么以及何时使用泛型函数 例如,我目前有一个名为logLikSSM的函数,它计算状态空间模型的对数可能性。不使用这个函数,我可以创建logLik.SSM函数或类似的函数,因为R中有通用函数logLik。这样做的好处是logLik比logLikSSM写起来要短,但是这里面真的还有其他的点吗 类似的情况下,stats包中有一个名为simulate的通用函

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

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

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

如果这个问题对这里来说太模糊,我很抱歉。

好问题

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

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

这个模式通常在开发者不知道他/她希望用户传递给所考虑的方法的每个对象的对象类时调用

由于这种不确定性,这种设计模式(在许多其他语言中称为重载)被调用,它需要R来计算对象类,然后根据对象类型将该对象分派给适当的方法。

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

尝试给你一个有用的答案,超出你的问题的细节,考虑当调用StGeNoGy时,原始方法发生了什么。p> 原始函数体被替换为用于根据传入的对象类型执行顶级分派的代码。这将替换原始函数体,该函数体只向下滑动一级,因此它将成为顶级(通用)函数分派到的默认方法

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

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

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

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

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

    考虑到您的函数与R核心中的泛型函数有着完全不同的用途,那么它可能更容易混淆而不是有用,因此在这种情况下,您可能不会创建一个方法,而是拥有自己的函数名

    您可能需要阅读(请参阅该页底部的Vignettes下的
    zoo Design
    链接),其中讨论了进入zoo软件包的设计思想。其中包括这里讨论的想法


    编辑:增加了缺点。

    现在有一个巨大的缺点:

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

    其中存在一个谬误,即组件、可重用对象、服务等是解决所有软件难题的灵丹妙药

    以及为什么绝大多数软件都有缺陷、臃肿、运行不一致,而技术支持几乎不可能诊断您的问题

    在当时,静态链接和小型可执行文件是有原因的。但这一代代码现在就开始,现在就获得报酬,以后再调试(如果有的话),在裁员/IPO到来之前,已经记不起代码实际工作非常可靠的日子了,安装/集成不需要200美元/小时的Big 4顾问或黑客,他们花了一周时间试图安装一些“简单”的开源产品并有效运行


    但是,如果您想继续编写越来越短的函数/方法名称的传统,请随意。

    谢谢,我确实考虑了第一个优点,但我没有考虑第二点。关于优化和logLik的好观点,必须进行测试。我还要看一下动物园手册。谢谢,这让我更好地理解了泛型背后的道理。