4

在我回答我的问题之前,有一点前言,所以和我在一起!

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

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

为了实现这一点,我尝试为类函数的对象定义一个新的 [] 方法,即

`[.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)
     }
}

瞧!有用。(我知道,我可能应该将修改后的函数分配回它们原来的包环境,但你明白了)。

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

谢谢!

4

1 回答 1

1

这类似于Defaults 包所做的。这个包被归档是因为作者认为修改其他包的代码是一件“非常糟糕的事情”。我想大多数人都会同意。仅仅因为你做到,并不意味着这是一个好主意。

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

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

更改其他包中函数的参数也有可能使其他人很难重现您的结果,因为他们必须具有您的所有参数设置。除非您总是在指定所有参数的情况下调用函数,否则这会违背您尝试做的事情的目的。

于 2017-02-21T14:21:03.893 回答