修改其他包中的函数类是不明智的吗?

时间:2017-02-21 14:02:39

标签: r r-s3

在我提出问题之前有一些序言,所以请跟我一起!

对于我正在开发的R包,我想让内容partially apply函数的用户尽可能简单。我有想法使用[]运算符来调用我的部分应用程序函数,我将其命名为“partialApplication”。我的目标是:

dnorm[mean = 3](1:10) 
# Which would be exactly equivalent to:
dnorm(1:10, mean = 3)

为了达到这个目的,我尝试为类函数的对象定义一个new []方法,即

`[.function` <- function(...) partialApplication(...)

但是,R会发出一个警告,即函数对象的[]方法被“锁定”。 (有没有办法覆盖它?)

我的想法似乎被挫败了,但我想到了一个简单的解决方案:我可以发明一个新的S3类“partialAppliable”并为它创建一个[]方法,即

`[.partialAppliable` = function(...) partialApplication(...)

然后,我可以使用我想要的任何函数并将'partialAppliable'附加到它的类中,现在我的方法将起作用。

class(dnorm) = append(class(dnorm), 'partialAppliable')
dnorm[mean = 3](1:10)
# It works!

现在这是我的问题/问题:我希望用户能够使用他们想要的任何功能,所以我想,如果我遍历活动环境中的所有对象(使用ls)并附加'partialAppliable'怎么办?到所有功能的类?例如:

allobjs = unlist(lapply(search(), ls))
#This lists all objects defined in all active packages

for(i in allobjs) {
     if(is.function(get(i))) {
        curfunc = get(i)
        class(curfunc) = append(class(curfunc), 'partialAppliable')
        assign(i, curfunc)
     }
}

瞧!有用。 (我知道,我应该将修改过的函数分配回原始的包环境中,但是你得到了图片)。

现在,我不是一名专业程序员,但我已经认识到做这种事情(全局修改所有包中的所有变量)通常被认为是不明智/有风险的。但是,我想不出会出现任何具体问题。所以这是我的问题:这样做会产生什么问题?任何人都可以想到这样做会破坏特定的功能/包吗?

谢谢!

1 个答案:

答案 0 :(得分:1)

这类似于Defaults package所做的。该软件包已存档,因为作者认为修改其他软件包的代码是非常糟糕的事情&#34;。我想大多数人会同意。仅仅因为你可以做到这一点,并不意味着它是一个好主意。

而且,不,您肯定不应该将修改后的功能分配回原始的包环境。当包不必要地修改用户搜索路径时,CRAN不喜欢,所以如果他们允许包修改其他包的函数参数,我会感到惊讶。

您可以通过将所有已修改的函数放在搜索路径上的环境中来解决此问题。但是,您必须首先确保始终搜索环境,这意味着每次加载另一个包时都要修改搜索路径。

更改其他包中函数的参数也有可能使其他人很难重现结果,因为它们必须具有所有参数设置。除非你总是用所有指定的参数调用函数,否则会破坏你试图做的目的。