我在R中重载%运算符中的%时出现问题。在重载==运算符之后也是如此,因为我的“类型”类不是R中的基本值,%是%:
setMethod("==", signature(e1 = "Type", e2 = "ANY"), function (e1, e2) {
class(e2)=="Type" && e1$name == e2$name
})
setMethod("==", signature(e1 = "ANY", e2 = "Type"), function (e1, e2) {
class(e1)=="Type" && e1$name == e2$name
})
setMethod("%in%", signature(e1 = "Type", e2 = "list"), function (e1, e2) {
for (i in e2) {
if (e1 == i)
return(TRUE);
}
return(FALSE);
})
最后一个方法返回以下错误
Creating a generic function from function ‘%in%’ in the global environment
Errore in match.call(definition, call, expand.dots) :
unused arguments (e1 = c("Type", ""), e2 = c("list", ""))
我怎么能解决我的问题?提前致谢
答案 0 :(得分:3)
你有错误的论点。看看:
`%in%`
function (x, table)
match(x, table, nomatch = 0L) > 0L
<bytecode: 0x7ffd5984e978>
<environment: namespace:base>
您需要更改方法以将x
和table
作为参数。这就是您收到错误unused arguments (e1 = c("Type", ""), e2 = c("list", ""))
的原因,因为e1
和e2
不是通用定义的一部分。
答案 1 :(得分:1)
我发现重载运算符的最简单方法是执行类似于以下的函数:
"%in%" = function(x,y) {
if(parameter_condition) {
response_function
} else {
.Primitive("%in%")(x,y)
}
}