2016-06-02 11 views
6

Ci scusiamo per il titolo, non so in che altro modo di esprimere questa domanda.R S4 setMethod '[' distinguere gli argomenti mancanti?

Se voglio creare setMethod in una classe, come faccio a distinguere tra i casi simili di mat[i,] e mat[i]?

So per l'ex posso usare:

setMethod("[", 
    signature(x = "foo", j = "missing", drop = "missing"), 
    function(x,i,j,drop) return(myFunc(x,i)) 
) 

Come posso impostare un metodo per distinguere quest'ultima in cui non vorrei che per selezionare le righe, ma come elementi nella classe basematrix?

Guardando la documentazione ?[ mi aspettavo qualcosa di simile alla seguente dovrebbe funzionare:

setMethod("[", 
    signature(x = "foo", i = "numeric"), 
    function(x,i,j,drop) return(myFunc(x,i)) 
) 

ma è in conflitto con i metodi definiti in precedenza in cui j e drop mancano.

L'idea è la stessa di

mat <- matrix(seq(9), 3, 3) 

mat[c(1,3),] 
1 4 7 
3 6 9 

mat[c(1,3)] 
[1] 1 3 

risposta

3

Troverete un sacco di esempi nel pacchetto di Matrix. Usa S4 e implementa nuove classi e metodi per le matrici. Per quanto ne so, non c'è modo di dichiarare ciò che stai cercando nella firma. Invece è necessario utilizzare la funzione nargs per distinguere tra mat[1] e mat[1, ]. Ecco un esempio di come farlo:

setClass("foo", slot = c(mat = "matrix")) 

setMethod(
    "[", 
    signature(x = "foo", i = "missing", j = "missing", drop = "missing"), 
    function(x, i, j, drop = FALSE) { 
    x 
    } 
) 

setMethod(
    "[", 
    signature(x = "foo", i = "numeric", j = "missing", drop = "missing"), 
    function(x, i, j, ..., drop) { 
    if (nargs() == 3) [email protected][i, ] 
    else [email protected][i] 
    } 
) 

setMethod(
    "[", 
    signature(x = "foo", i = "numeric", j = "numeric", drop = "missing"), 
    function(x, i, j, ..., drop) { 
    [email protected][i, j] 
    } 
) 

mat <- new("foo", mat = matrix(seq(9), 3, 3)) 

mat[] 
mat[2:5] 
mat[1:2, ] 
mat[1:2, 2] 

Tuttavia, sarebbe più facile se si estende direttamente la 'matrice' classe di base (o 'Matrix' dal pacchetto Matrix) e fare qualcosa di simile

setClass("Matrix", contains = "matrix") 

poiché ottieni questi metodi gratuitamente. Nota, ad esempio, che nell'implementazione di cui sopra, devi ancora occuparti dell'argomento drop. E fondamentalmente devi reimplementare ciò che è già lì.

+0

Questo sembra fare il trucco – cdeterman

Problemi correlati