【问题标题】:R S4 best practice: slot with "vector of S4 objects"R S4 最佳实践:带有“S4 对象向量”的插槽
【发布时间】:2014-11-07 10:53:25
【问题描述】:

如何正确地做到以下几点:

我有一个带有插槽 parentSpectrum、childSpectra、名称的类 SpectraSet(为了简单起见)

名字是字符()

parentSpectrum 应该包含一个 ParentSpec 类的对象(所以它是 ParentSpec 类型)

childSpectra 应该包含 n 个 ChildSpec 类的对象。但是我不能使它成为 ChildSpec 类型,因为向量只能包含原子类型。在这种情况下,最佳做法是什么?我可以将其设为 list() 并在有效性检查中键入检查,但有更好的方法吗?

【问题讨论】:

    标签: r s4 slot


    【解决方案1】:

    这是我过去提供的related anaswers

    重新考虑类设计通常会更好,因此 ChildSpec 本质上是一个向量——至少支持 length() 和子集 [, [[。你上面的问题就消失了,设计与 R 的矢量化方向一致,并且可能常见的操作是有效的。

    实现您自己的类型检查列表的替代方法(实际上是另一种替代方法)是重用 BiocdonductorS4Vectors 类中的基础架构

    .X = setClass("X", representation(x="numeric"))
    .XList = setClass("XList", contains="SimpleList",
        prototype=prototype(elementType="X"))
    

    在行动中

    > xl = .XList(listData=list(.X(x=1), .X(x=2)))
    > xl
    XList of length 2
    > xl[[2]]
    An object of class "X"
    Slot "x":
    [1] 2
    

    【讨论】:

    • 嗯 - 不确定在我的情况下这种方法(考虑 ChildSpectra 而不是 ChildSpectrum)是否可行,因为我从另一个包(MSnbase Spectrum2)中的现有 Spectrum 类派生 ChildSpec。此外,每个频谱已经是多个 n 长度向量(可以导出为数据帧)加上额外的 1 长度属性的对象。我仍然需要解决这个问题。
    猜你喜欢
    • 2016-06-09
    • 1970-01-01
    • 2012-10-17
    • 1970-01-01
    • 1970-01-01
    • 2015-06-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多