2015-12-10 10 views
5

Diciamo che ho una classe S4 chiamata testClass. I contenuti sono irrilevanti allo scopo di questa domanda, ma facciamo in modo che contenga un valore numerico.Come definire il metodo S4 per prendere l'opposto dell'oggetto?

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

Mi piacerebbe definire un metodo che funzioni come il prendere l'opposto di un oggetto. Per esempio:

vec <- rnorm(10) 
-vec 

ho pensato che questo sarebbe un metodo dichiarando Arith con il primo argomento mancante.

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

Tuttavia, quando provo ad applicare il metodo ottengo il seguente errore:

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

Error in -tc : invalid argument to unary operator

risposta

6

Hah! Dopo averle giocate ancora un po 'ho scoperto che è l'argomento e2 che deve essere scomparso. I seguenti lavori:

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

Nice demo. Solo per curiosità, da dove viene quel '.Generico '(cioè dove si trova il suo valore)? –

+0

'? .Generic' produce dopo un po 'di scorrimento:'' .Generic 'è un vettore di lunghezza un carattere che nomina la funzione generica. – thothal

+0

C'è qualche differenza se si prova 'setMethod (" - ", c (e1 =" testClass ", e2 =" missing "), function (e1, e2) -e1 @ a)'? – nicola