【问题标题】:S4 Classes: Multiple types per slotS4 类:每个插槽多种类型
【发布时间】:2012-10-21 21:04:30
【问题描述】:

是否可以创建一个 S4 类,其中一个或多个插槽可以属于多个类?例如。假设您遇到数据可以是向量或 data.frame 的情况。

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

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

PS:搜索有关 S4 课程的有用教程会产生有限的结果。链接到一个关于 S4 类创建/使用/文档的好教程将不胜感激。

【问题讨论】:

  • 带槽的东西是 S4 类。
  • 不仅如此,你展示的一切都与S4方法机制有关。
  • 可能会更糟;你可以说“R5 类”

标签: r s4


【解决方案1】:

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 有一个tutorial(此页面上的示例不是那么强大,它实例化了Person,而从概念上讲,人们会写一个People 来利用R 的矢量化优势),最近的@987654322 中有一个部分@。我认为两者都没有详细介绍阶级工会。

【讨论】:

  • Martin Morgan -- 您在 SO 上对这么多真正的 R 编程问题的出色回答对这个社区来说是一个很好的补充。只是想给你道具,谢谢。
  • 同意,之前关于 S4 问题的答案已经很好地解释了。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-11-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-11-30
  • 1970-01-01
相关资源
最近更新 更多