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
方法可能很难实现,因为您所知道的是槽包含类联合的父类型之一。
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
来利用 R 的矢量化优势)并且最近的Bioconductor 课程中有一个部分。我认为两者都没有详细介绍阶级工会。