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

R 修改其他包中的函数类是否不明智?,r,r-s3,R,R S3,在我开始我的问题之前有一点序言,所以跟我来 对于我正在开发的R包,我想让用户尽可能容易地内联函数。我的想法是使用[]运算符调用我的部分应用程序函数,我将其命名为“partialApplication”。我的目标是: dnorm[mean = 3](1:10) # Which would be exactly equivalent to: dnorm(1:10, mean = 3) 为了实现这一点,我尝试为类函数的对象定义一个新的[]方法,即 `[.function` <- functi

在我开始我的问题之前有一点序言,所以跟我来

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

dnorm[mean = 3](1:10) 
# Which would be exactly equivalent to:
dnorm(1:10, mean = 3)
为了实现这一点,我尝试为类函数的对象定义一个新的[]方法,即

`[.function` <- function(...) partialApplication(...)
然后,我可以接受我想要的任何函数并将“partialapplicatable”附加到它的类中,现在我的方法就可以工作了

class(dnorm) = append(class(dnorm), 'partialAppliable')
dnorm[mean = 3](1:10)
# It works!
现在我的问题是:我希望用户能够使用他们想要的任何函数,所以我想,如果我循环活动环境中的所有对象(使用ls)并将“partialapplicatable”附加到所有函数的类中,会怎么样?例如:

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)
     }
}
瞧!它起作用了。(我知道,我可能应该将修改后的函数重新分配到它们原来的包环境中,但您可以理解这一点)

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


谢谢

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

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

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


更改其他包中函数的参数也可能会使其他人很难再现您的结果,因为他们必须具有您的所有参数设置。除非您总是使用指定的所有参数调用函数,否则这将破坏您尝试执行的操作。

谢谢!事实证明,R无论如何都不允许我在其原始包环境中重新分配函数。然而,我一直在玩弄你的想法,将修改后的函数分配到一个新环境中,并将新环境附加到搜索路径上。你可以尝试构建一个简单的S3系统,而不是修改,例如
partiallyapplicatable=function(x)结构(x,class=c(“partiallyapplicatable”,class(x));“[.partiallyapplicative”=函数(x,…{formals(x)[name(list(…))]=as.list(substitute(list(…)))[-1];return(x)}
以便函数根据需要显式地获得一个“class”属性;并将其用作
partiallyapplicative(dnorm)[mean=4-1,sd=sqrt(pi+1)](1:5)
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)
     }
}