21

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

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

それとも、サブクラス/スーパークラスの定義が必要になるような状況ですか?

PS: S4 クラスに関する有用なチュートリアルを検索しても、限られた結果しか得られません。S4 クラスの作成/使用/ドキュメントに関する優れたチュートリアルへのリンクをいただければ幸いです。

4

1 に答える 1

31

R には「クラス共用体」があるため、

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

クラスdata.frameORvectorは仮想であるため、インスタンス化することはできませんが、他のスロットで使用したり ( representation=)、含まれるクラスとして使用したり ( contains=)、ディスパッチ用に使用したりできます。

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

スロットにクラス ユニオンの親型の 1 つが含まれていることしかわかっていないため、メソッドを実装するのは難しい場合があります。

setGeneric("hasa", function(object) standardGeneric("hasa"))
setMethod("hasa", "data.frameORvector", function(object) typeof(object@x))

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

?Classes?Methods?setClass、および友人に関するドキュメントは実際に役に立ちます。Hadley Wickham にはチュートリアル(このページの例はそれほど強力ではありませ。どちらもクラス ユニオンの詳細には触れていないと思います。PersonPeople

于 2012-10-22T00:17:19.587 に答える