在我提出问题之前有一些序言,所以请跟我一起!
对于我正在研究的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)
}
}
瞧!有用. (我知道,我应该将修改过的函数分配回原始的包环境中,但是你得到了图片).
现在,我不是一个专业的程序员,但我已经认识到做这种事情(全局修改所有包中的所有变量)通常被认为是不明智/有风险的.但是,我想不出会出现任何具体问题.所以这是我的问题:这样做会产生什么问题?任何人都可以想到这样做会破坏特定的功能/包吗?
谢谢!
最佳答案 这类似于
Defaults package所做的.该软件包已归档,因为作者认为修改其他软件包的代码是“非常糟糕的事情”.我想大多数人会同意.仅仅因为你可以做到这一点,并不意味着这是一个好主意.
而且,不,您肯定不应该将修改后的功能分配回原始的包环境.当包不必要地修改用户搜索路径时,CRAN不喜欢,所以如果他们允许包修改其他包的函数参数,我会感到惊讶.
您可以通过将所有已修改的函数放在搜索路径上的环境中来解决此问题.但是,您必须首先确保始终搜索环境,这意味着每次加载另一个包时都要修改搜索路径.
更改其他包中函数的参数也有可能使其他人很难重现结果,因为它们必须具有所有参数设置.除非你总是在指定所有参数的情况下调用函数,否则会破坏你想要做的事情的目的.