3

This maybe trivial but I haven't found anything online. Is it possible to create a vector of empty S4 objects in R? Something like:

s4Vec<-rep(emptyS4Object,10)

Thanks

4

2 回答 2

4

像这样:

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

?

于 2013-05-03T20:29:51.263 回答
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] 

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

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

于 2013-05-03T20:44:46.227 回答