R中的S4级的一元加

Gum*_*meo 6 r operator-overloading unary-operator s4

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

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))
          }
)
Run Code Online (Sandbox Code Playgroud)

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

H+W
An object of class "HWtest"
Slot "expr":
[1] "Hello  +  World"
Run Code Online (Sandbox Code Playgroud)

现在,一元加号当然不起作用,所以必须超载

+H
Error in +H : invalid argument to unary operator
Run Code Online (Sandbox Code Playgroud)

所以我尝试以下列方式重载它:

setMethod("+", signature(e="HWtest"),
          function(e){
            new("HWtest", 
                expr = paste("+ ",e@expr))
          }
)
Run Code Online (Sandbox Code Playgroud)

但这会产生错误:

Error in match.call(fun, fcall) : 
  argument 1 matches multiple formal arguments
Run Code Online (Sandbox Code Playgroud)

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

nru*_*ell 6

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

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

R> H + W
An object of class "HWtest"
Slot "expr":
[1] "Hello  +  World"
Run Code Online (Sandbox Code Playgroud)

引用帮助文件?groupGeneric,

[...]当遇到一元运算符时,使用一个参数调用Ops方法,并且缺少e2.

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

可以出现另外两个特殊类名:"ANY",这意味着该参数可以包含任何类; 并且"缺失",意味着此参数不得出现在调用中以匹配此签名.

  • 我认为`?setMethod`也很有用,它解释了如何指示缺少arg,比如"缺失",这意味着该参数不能出现在调用中以匹配此签名. (2认同)