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 にはチュートリアル(このページの例はそれほど強力ではありません。どちらもクラス ユニオンの詳細には触れていないと思います。Person
People