【问题标题】:Create a vector of empty S4 objects创建空 S4 对象的向量
【发布时间】:2013-05-03 20:06:18
【问题描述】:

这可能微不足道,但我没有在网上找到任何东西。 是否可以在 R 中创建空 S4 对象的向量? 比如:

s4Vec<-rep(emptyS4Object,10)

谢谢

【问题讨论】:

  • 向量只能包含原子类型:逻辑、整数、实数、复数、字符串或原始。您是说列表吗?
  • 非常感谢您的指正。现在我知道向量是无关紧要的,我将通过将向量交换为列表来改写我的问题。那么,是否可以在 R 中创建一个空 S4 对象列表?
  • @DavidRobinson -- 不正确。列表和表达式对象也是向量的类型。 (尝试is.vector(list())is.vector(expression()) 进行确认。)
  • replicate() 也可以吗? (没试过)
  • @BenBolker +1:完美运行

标签: r s4


【解决方案1】:

像这样:

s4Vec <- lapply( rep("yourClass", 10), new )

?

【讨论】:

  • 如果有任何答案能解决您的问题,如果您能接受,那就太好了。
【解决方案2】:

我很想去

.A <- setClass("A", representation(x="integer"))
a <- list(.A())[rep(1, 100)]

创建一个实例(使用setClass返回的方便的生成器)然后复制该对象,就像R复制列表中的任何其他对象一样——a的元素实际上是同一个实例,标记为就绪更改时要复制;您可以从

中看到这一点
> .Internal(inspect(a))
@4e3bc1d8 19 VECSXP g0c2 [NAM(2)] (len=2, tl=0)
  @60b738b8 25 S4SXP g0c0 [OBJ,NAM(2),S4,gp=0x10,ATT] 
  ATTRIB:
[...]
  @60b738b8 25 S4SXP g0c0 [OBJ,NAM(2),S4,gp=0x10,ATT] 

其中@4e3bc1d8 是列表的地址,@60b738b8 25 S4SXP g0c0 [OBJ,NAM(2),S4,gp=0x10,ATT] 标记每个 S4 元素的描述的开始,它们实际上都在内存中的同一位置 @60b738b8 并且所谓的 NAMED 字段设置为 2 NAM(2)。请注意,更改列表的单个元素可能会触发整个列表的副本。

但是,如果您的每个“A”对象都旨在代表传统数据库中的“行”,那么您应该重新考虑您的设计并让“A”代表整个table 和 slot 代表列。因此,您只需创建一个“A”,而不是多个,并使用等长向量填充它的插槽。这将节省内存,并为您提供高效的下游矢量化计算,而不是迭代。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-04-09
    • 1970-01-01
    • 1970-01-01
    • 2021-04-05
    • 2020-09-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多