运算符重载R中的函数 - 奇怪的行为

时间:2013-03-15 12:17:58

标签: r oop class function reference-class

不幸的是,像(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不关心“常用”函数而是类成员函数?有谁知道如何将操作员“扩展”到通常的功能?

2 个答案:

答案 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