不幸的是,像(f+g)(3)
这样的f和g都是一元函数在R中不起作用。因此,我尝试以下列方式重载“+”运算符以实现一元函数:
"+.function" = function(e1, e2){
return(function(x) e1(x) + e2(x))
}
但如果我尝试使用它,这什么都不做。代码
a = function(x) 2*x
(a+a)(2)
产生的错误与+.function
未定义的错误相同。
通过一段时间的游戏我发现事实上有可能以这种方式添加函数:如果函数是引用类的成员函数,这是有效的!即,以下代码(以及上面的“+”定义)
clsA = setRefClass("clsA",
methods = list(
b = function(x) 2*x
))
inst_a = clsA$new()
(inst_a$b + inst_a$b)(2)
返回“8”(如预期的那样)。因此,我已经为我的问题找到了某种解决方法。现在我的问题是:
这种奇怪行为的原因是什么?为什么+.function
不关心“常用”函数而是类成员函数?有谁知道如何将操作员“扩展”到通常的功能?
答案 0 :(得分:5)
如果您重新定义a
类,例如class(a)<-"ownfunction"
(或更好class(a)<-c("ownfunction","function")
,并将"+.function"
设为"+.ownfunction"
,那么{ {1}}有效。
似乎 (a+a)(2)
类以某种特殊方式处理:如果你运行function
,你会看到debug("+.function");(a+a)(2)
甚至没有被调用。
编辑:见评论。
答案 1 :(得分:3)
作为解决方法,您可以像这样定义special operator(%...%
):
"%+%" <- function(e1, e2) {
return(function(x) e1(x) + e2(x))
}
a <- function(x) 2*x
(a %+% a)(2) # == 8