2015-12-10 9 views
5

Załóżmy, że mam klasę S4 o nazwie testClass. Treść nie ma znaczenia dla celu tego pytania, ale sprawmy, by zawierała wartość liczbową.Jak zdefiniować metodę S4 do przyjmowania przeciwieństwa obiektu?

#' An S4 class that stores a list. 
#' @export 
setClass("testClass", 
       representation(a="numeric")) 

Chciałbym zdefiniować metodę, która działa tak, jakby była przeciwieństwem obiektu. Na przykład:

vec <- rnorm(10) 
-vec 

myślałem, że to będzie deklarowania Arith metodę z pierwszym argumentem brakuje.

#' @export 
setMethod("Arith", c(e1="missing", e2="testClass"), 
        function(e1, e2) 
        { 
         op = .Generic[[1]] 
         switch(op, 
          `-` = return([email protected]) 
         ) 
        } 
) 

Jednak, gdy staram się stosować metodę pojawia się następujący błąd:

tc <- new("testClass", a=2) 
-tc 

Error in -tc : invalid argument to unary operator

Odpowiedz

6

Hah! Po tym, jak bawiłem się nim, odkryłem, że jest to argument, którego brakuje. Następujące prace:

#' @export 
setMethod("Arith", c(e1="testClass", e2="missing"), 
        function(e1, e2) 
        { 
         op = .Generic[[1]] 
         switch(op, 
          `-` = return([email protected]) 
         ) 
        } 
) 
+0

Ładna prezentacja. Z czystej ciekawości, skąd pochodzi gen. Gen. (Gdzie jest jego wartość)? –

+0

'' .Generic' produkuje po pewnym przewijaniu: ''.Generic jest długometrażowym wektorem nazwującym funkcję ogólną." – thothal

+0

Czy jest jakaś różnica, jeśli spróbujesz 'setMethod (" - ", c (e1 =" testClass ", e2 =" brakujący "), funkcja (e1, e2) -e1 @ a)'? – nicola

Powiązane problemy