R

时间:2015-11-05 15:19:27

标签: r operator-overloading s4 unary-operator

我正在试验R中的S4类,我试图为我的对象定义一个加号(+)运算符,即重载加号运算符。我设法重载二进制+,但我无法弄清楚如何重载一元加号。这是我想要实现的最小工作(一元操作员不工作)示例:

setClass("HWtest",
         representation(expr  = "character"),
         prototype = list(expr  = NA_character_)
)

H <- new("HWtest", expr="Hello")
W <- new("HWtest", expr="World")

setMethod("+", signature(e1="HWtest", e2="HWtest"),
          function(e1,e2){
            new("HWtest", 
                expr = paste(e1@expr," + ",e2@expr))
          }
)

现在我可以使用+运算符,它可以顺利运行:

H+W
An object of class "HWtest"
Slot "expr":
[1] "Hello  +  World"

现在一元加上当然没有用,所以必须超载

+H
Error in +H : invalid argument to unary operator

所以我试着用以下方式重载它:

setMethod("+", signature(e="HWtest"),
          function(e){
            new("HWtest", 
                expr = paste("+ ",e@expr))
          }
)

但这会产生错误:

Error in match.call(fun, fcall) : 
  argument 1 matches multiple formal arguments

是否有可能超载一元加?如果是这样,我将如何为这个最小的例子做到这一点?

1 个答案:

答案 0 :(得分:6)

尝试添加此项(除了二进制重载):

setMethod("+", signature(e1 = "HWtest", e2 = "missing"),
          function(e1){
            new("HWtest", 
                expr = paste("+ ", e1@expr))
          }
)
R> +H
An object of class "HWtest"
Slot "expr":
[1] "+  Hello"

R> H + W
An object of class "HWtest"
Slot "expr":
[1] "Hello  +  World"

引用帮助文件?groupGeneric

  

[...]当遇到一元运算符时,调用Ops方法   一个参数和e2缺失。

正如Frank指出的那样,?setMethod帮助文件包含一些有关使用missing作为方法签名的有用信息(强调添加):

  

可以出现两个额外的特殊类名:&#34; ANY&#34;,意思是   这个论点可以有任何类; 和&#34;缺少&#34;,意思是   此参数不得出现在调用中以便与此匹配   签名。