我正在试验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
是否有可能超载一元加?如果是这样,我将如何为这个最小的例子做到这一点?
答案 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;,意思是 此参数不得出现在调用中以便与此匹配 签名。强>