2014-02-16 4 views
2

R의 % in % 연산자에 과부하가 발생했습니다. "Type"클래스가 R의 기본 값이 아니고 %의 %가 아니기 때문에 == 연산자도 오버로드 된 후에 다음과 같은 오류가 발생합니다.R의 % in 연산자의 오버로드 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", "")) 

가 어떻게 내 문제를 해결할 수있는 다음과 같은 오류를 반환? 미리 감사드립니다.

답변

3

잘못된 인수가 있습니다. 당신은 인수로 xtable을 가지고 귀하의 방법을 변경해야

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

: 봐. 따라서 e1e2은 일반 정의에 포함되어 있지 않으므로 unused arguments (e1 = c("Type", ""), e2 = c("list", "")) 오류가 발생합니다.

1

내가 연산자를 오버로드하는 가장 쉬운 방법은 다음과 유사한 기능을 수행하는 것을 알게 :이 방법으로

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

, 내가 % 연산자의 %의 이전의 모든 overridings 제거되지 않습니다 (예 : 라이브러리가 이미 재정의 한 경우?) – jackb

+1

. 그게 잠재적 인 문제라면, 나는 위의 대답으로 갈 것입니다. 나는이 질문을 통해 오는 모든 사람들의 필요에 따라 작업을 수행하는 또 다른 방법을 제공하기를 원했습니다. –

+0

물론, 문제 없습니다. 나는 이것이 어떤 가능한 cotnext에서 사용될 수 있는지 알고 싶었습니다 ... 어쨌든 고마워요! – jackb