在R中重载%in%运算符

在R中重载%in%运算符,r,operator-overloading,overloading,R,Operator Overloading,Overloading,我在重载R中的%in%运算符时遇到问题。在重载==运算符之后,因为我的类型类不是R中的基本值,而%in%: setMethod("==", signature(e1 = "Type", e2 = "ANY"), function (e1, e2) { class(e2)=="Type" && e1$name == e2$name }) setMethod("==", signature(e1 = "ANY", e2 = "Type"), function (e1, e

我在重载R中的%in%运算符时遇到问题。在重载==运算符之后,因为我的类型类不是R中的基本值,而%in%:

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", ""))

我怎样才能解决我的问题?提前感谢

您的论点有误。看看:

`%in%`
function (x, table) 
match(x, table, nomatch = 0L) > 0L
<bytecode: 0x7ffd5984e978>
<environment: namespace:base>

您需要更改方法,使x和table作为参数。这就是为什么会出现未使用参数e1=cType、e2=clist的错误,因为e1和e2不是泛型定义的一部分。

您的参数错误。看看:

`%in%`
function (x, table) 
match(x, table, nomatch = 0L) > 0L
<bytecode: 0x7ffd5984e978>
<environment: namespace:base>

您需要更改方法,使x和table作为参数。这就是为什么会出现未使用参数e1=cType、e2=clist的错误,因为e1和e2不是泛型定义的一部分。

我发现重载运算符的最简单方法是执行类似以下操作的函数:

"%in%" = function(x,y) {
    if(parameter_condition) {
        response_function
    } else {
    .Primitive("%in%")(x,y)
    }
}

我发现重载运算符的最简单方法是执行以下类似的函数:

"%in%" = function(x,y) {
    if(parameter_condition) {
        response_function
    } else {
    .Primitive("%in%")(x,y)
    }
}

这样,我是否可以删除%In%运算符之前的所有重写?例如,如果库已经重写了它,您可以。如果这是一个潜在的问题,我会同意上面的答案。我只是想根据遇到这个问题的人的需要,提供另一种执行任务的方法。当然,没问题。我只想知道这是否可以用于任何可能的未来。。。无论如何谢谢你!这样,我是否可以删除%In%运算符之前的所有重写?例如,如果库已经重写了它,您可以。如果这是一个潜在的问题,我会同意上面的答案。我只是想根据遇到这个问题的人的需要,提供另一种执行任务的方法。当然,没问题。我只想知道这是否可以用于任何可能的未来。。。无论如何谢谢你!