2012-10-21 19 views
15

Bir veya daha fazla sayıda yuva birden çok sınıfta olabileceği bir S4 sınıfı oluşturmak mümkün mü? Örneğin. Verilerin bir vektör veya bir data.frame olabileceği bir durum olduğunu varsayalım.S4 Sınıflar: Yuva başına birden çok tür

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

Ya da bir alt sınıf/süper sınıf tanımlamanın gerekli olduğu durum bu mu?

PS: S4 sınıflarında yararlı bir öğretici aramak, sınırlı sonuçlar üretir. S4 sınıfı oluşturma/kullanım/dokümantasyon ile ilgili iyi bir öğreticiye olan bağlantılar büyük ölçüde takdir edilecektir.

+6

Yuvalar S4 sınıflarıdır. – Spacedman

+0

Sadece bu değil, gösterdiğiniz her şey S4 metod mekanizması ile ilgilidir. –

+0

Evet, kötüyüm. Yanlış numara. –

cevap

22

R, böylece

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

sınıf data.frameORvector sanaldır ve 'sınıf birlikleri' sahiptir, böylece örneklenemez ancak ihtiva sınıf (contains=) gibi diğer yuvalara (representation=) kullanılabilir, ve sevk

için
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 

Yöntemleri tüm bildiklerini yuvalı sınıf birliğinin ana türlerinden biri içerdiğini olduğu için uygulamak zor olabilir.

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" 

Aslında ?Classes, ?Methods, ?setClass ve arkadaşları yararlı belgelerine bulabilirsiniz. Hadley Wickham bir tutorial (bu sayfadaki örnek o kadar güçlü değil, Person'u başlatıyor, kavramsal olarak ise R'nin vektörizasyon kuvvetlerini kullanmak için People yazıyordu) ve bu son Bioconductor course'da bir bölüm var. Sınıf birlikleriyle ilgili detaylara inanıyorum.

+6

Martin Morgan - SO üzerinde bu kadar çok sayıda gerçek R programlama sorusuna verdiğiniz müthiş cevaplar, bu topluluğa mükemmel bir ektir. Sadece sana sahne vermek istedim ve bunun için teşekkürler. –

+0

Katılıyorum ve önceki S4 sorularına verilen cevaplar çok iyi açıklanmıştır. –

İlgili konular