2012-10-21 3 views
15

È possibile creare una classe S4, in cui uno o più slot possono essere di più classi? Per esempio. Supponiamo che tu abbia una situazione in cui i dati potrebbero essere un vettore o un data.frame.Classi S4: più tipi per slot

exampleClass <- setClass("exampleClass", 
    representation(raw=c("data.frame","numeric","character"), 
    anotherSlot=c("data.frame","numeric")) 

Oppure, è questo il tipo di situazione in cui la definizione di una sottoclasse/super-classe diventa necessaria?

PS: la ricerca di un utile tutorial sulle classi S4 produce risultati limitati. I collegamenti a un buon tutorial sulla creazione/utilizzo/documentazione della classe S4 sarebbero molto apprezzati.

+6

Le cose con slot sono classi S4. – Spacedman

+0

Non solo, tutto ciò che mostri è correlato al meccanismo del metodo S4. –

+0

Sì, mio ​​male. Numero sbagliato. –

risposta

22

R ha sindacati della classe, così

setOldClass("data.frame") 
setClassUnion("data.frameORvector", c("data.frame", "vector")) 

La classe data.frameORvector è virtuale, quindi non può essere istanziata ma può essere utilizzato in altri slot (representation=), come classe contenuta (contains=), e per la spedizione

A = setClass("A", 
     representation=representation(x="data.frameORvector")) 


> A(x=1:3) 
An object of class "A" 
Slot "x": 
[1] 1 2 3 

> A(x=data.frame(x=1:3, y=3:1)) 
An object of class "A" 
Slot "x": 
    x y 
1 1 3 
2 2 2 
3 3 1 

metodi possono essere difficile da implementare, perché tutto quello che sai è che la slot contiene uno dei tipi principali del sindacato di classe.

setGeneric("hasa", function(object) standardGeneric("hasa")) 
setMethod("hasa", "data.frameORvector", function(object) typeof([email protected])) 

> hasa(A(x=1:5)) 
[1] "integer" 
> hasa(A(x=data.frame(y=1:5))) 
[1] "list" 

ho effettivamente trovare la documentazione su ?Classes, ?Methods, ?setClass e amici utile. Hadley Wickham ha un tutorial (l'esempio in questa pagina non è così forte, crea un'istanza Person, mentre concettualmente si scrive uno People per sfruttare i punti di forza di vettorizzazione di R) e c'è una sezione in questo recente Bioconductor course. Non penso che i dettagli dei sindacati di classe vadano entrambi in dettaglio.

+6

Martin Morgan - Le tue fantastiche risposte a tante domande di programmazione R qui su SO sono una grande aggiunta a questa community. Volevo solo darti oggetti di scena e grazie per quello. –

+0

Accetto, e le risposte precedenti sulle domande S4 sono state spiegate molto bene. –