在R语言中,S4类的一元加运算符

8
我正在尝试在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个回答

8
尝试添加以下内容(除了您的二进制重载之外):
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作为方法签名的一些有用信息(已加粗):

还可以出现两个特殊的类名:"ANY",表示此参数可以具有任何类;"missing",表示必须在调用中不出现此参数才能匹配此签名。


2
您IP地址为143.198.54.68,由于运营成本限制,当前对于免费用户的使用频率限制为每个IP每72小时10次对话,如需解除限制,请点击左下角设置图标按钮(手机用户先点击左上角菜单按钮)。 - Frank
好的,这对我来说澄清了一切!谢谢大家 :) - Gumeo

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接