在我回答我的问题之前,有一点前言,所以和我在一起!
对于我正在开发的 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)
}
}
瞧!有用。(我知道,我可能应该将修改后的函数分配回它们原来的包环境,但你明白了)。
现在,我不是专业程序员,但我发现做这种事情(全局修改所有包中的所有变量)通常被认为是不明智/有风险的。但是,我想不出会出现什么具体问题。所以这是我的问题:这样做可能会出现什么问题?谁能想到这样做会破坏的特定功能/包?
谢谢!