首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >S4类:每个插槽有多个类型

S4类:每个插槽有多个类型
EN

Stack Overflow用户
提问于 2012-10-22 05:04:30
回答 1查看 2.3K关注 0票数 21

是否可以创建一个S4类,其中一个或多个插槽可以属于多个类?例如。假设您有这样一种情况,数据既可以是向量,也可以是data.frame。

代码语言:javascript
复制
exampleClass <- setClass("exampleClass",
    representation(raw=c("data.frame","numeric","character"),
    anotherSlot=c("data.frame","numeric")) 

或者,这是需要定义子类/超类的情况吗?

PS:搜索关于S4类的有用教程会产生有限的结果。如能链接到有关S4类创建/使用/文档的教程,我们将不胜感激。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-10-22 08:17:20

R有“类联合”,因此

代码语言:javascript
复制
setOldClass("data.frame")
setClassUnion("data.frameORvector", c("data.frame", "vector"))

data.frameORvector是虚的,因此不能实例化,但可以在其他插槽(representation=)中作为包含的类(contains=)使用,也可以用于分派

代码语言:javascript
复制
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

方法可能很难实现,因为您所知道的就是槽包含类联合的父类型之一。

代码语言:javascript
复制
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有一个tutorial (这个页面上的示例并不是很强大,它实例化了Person,而从概念上讲,人们会编写一个People来利用R的矢量化优势),并且在最近的Bioconductor course中有一个部分。我认为这两个都不会详细介绍类工会。

票数 31
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13002200

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档