8

不幸的是,像(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产生与 if甚至没有定义相同的错误。

玩了一段时间后,我发现实际上有可能以这种方式添加函数:如果函数是引用类的成员函数,那就行了!即,以下代码(连同上面的“+”定义)

clsA = setRefClass("clsA", 
  methods = list(
    b = function(x) 2*x
  ))

inst_a = clsA$new()
(inst_a$b + inst_a$b)(2)

返回“8”(如预期的那样)。因此,对于我的问题,我已经有了某种解决方法。现在我的问题是:

这种奇怪行为的原因是什么?为什么不+.function关心“普通”函数而是类成员函数?有谁知道如何将运算符“扩展”到常用功能?

4

2 回答 2

5

如果您重新定义 的类a,例如 like class(a)<-"ownfunction"(或更好class(a)<-c("ownfunction","function")的 ,并制作您的"+.function"as "+.ownfunction",那么就(a+a)(2)可以了。

似乎function该类以某种特殊方式处理:如果您运行debug("+.function");(a+a)(2),您会看到它"+.function"甚至没有被调用。

编辑:见评论。

于 2013-03-15T12:38:58.620 回答
3

作为一种解决方法,您可以像这样定义一个特殊的运算符( %...%):

"%+%" <- function(e1, e2) {
  return(function(x) e1(x) + e2(x))
}

a <- function(x) 2*x
(a %+% a)(2) # == 8
于 2013-03-15T12:27:58.087 回答