2012-10-21 10 views
15

1つ以上のスロットを複数のクラスにすることができるS4クラスを作成できますか?例えば。データがベクトルまたはdata.frameのいずれかになる状況があるとしましょう。S4クラス:スロットごとに複数のタイプ

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

また、これはサブクラス/スーパークラスの定義が必要になる状況ですか?

PS:S4クラスで役立つチュートリアルを検索すると、限られた結果しか得られません。 S4クラスの作成/使用法/ドキュメントに関する良いチュートリアルへのリンクは大いにありがたく思うでしょう。

+6

スロット付きのものはS4クラスです。 – Spacedman

+0

それだけでなく、あなたが示すものはすべてS4メソッドの仕組みに関係しています。 –

+0

はい、私の悪いです。間違った番号。 –

答えて

22

Rが仮想であるので、インスタンス化できないが、含まれるクラス(contains=)など、他のスロット(representation=)で使用することができる「クラス組合ので

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

クラスdata.frameORvectorを有しますあなたが知っているすべてのスロットがクラス組合の親タイプのいずれかが含まれていることですので、発送

ため
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 

方法は実装が難しいことができます。

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" 

私は実際に?Classes?Methods?setClass上のドキュメントを見つけると、友人は役に立ち。 Hadley Wickhamはtutorialです(このページの例はそれほど強くない、Personをインスタンス化しますが、概念的にはRのベクトル化の強みを利用するためにPeopleと書いています)。私は、いずれかのクラスの労働組合について詳しく述べるとは思わない。

+6

Martin Morgan - 本当に多くの本当のRプログラミングの質問へのあなたの素晴らしい答えは、このコミュニティのすばらしさです。ちょうどあなたに小道具を与えたいと思って、それに感謝します。 –

+0

同意し、S4質問に関する以前の回答は非常によく説明されています。 –

関連する問題