为多个列表元素分配同一对象的R方法

5

我目前有一个循环 - 实际上是一个模拟模型中的循环嵌套,随着个体数量的增加而变慢。我已经向量化了大部分内容,并使其运行速度快了很多。但是有一部分需要将列表的多个元素赋值为相同的东西,从而简化了一个大循环,只实现了我想要的任务:

new.matrices[[length(new.matrices)+1]]<-old.matrix

在每次循环迭代时,上面的代码行会被调用,并且相同的矩阵对象会被分配给列表的下一个新元素。

我正在尝试对此进行向量化处理 - 如果可能的话,或者比循环或应用语句更快。

到目前为止,我已经尝试了以下方法:

indices <- seq(from = length(new.matrices) + 1, to = length(new.matrices) + reps)
new.matrices[indices] <- old.matrix

然而,这会导致以下消息:

Warning message:
In new.effectors[effectorlength] <- matrix :
  number of items to replace is not a multiple of replacement length

它还试图将old.matrix的一个值分配给new.matrices的一个元素,如下所示:
[[1]]
[1] 8687

[[2]]
[1] 1

[[3]]
[1] 5486

[[4]]
[1] 0

当所需结果是一个列表元素等于一个完整矩阵时,复制 old.matrix
有没有一种方法可以将矩阵粘贴到列表元素中而不使用循环向量化?目前的实现方式需要进行数千次重复,这会严重拖慢速度,因此我希望尽可能地向量化。

6
new.matrices[indices] <- rep(list(old.matrix), length(indices)) 的翻译:将旧矩阵复制为列表,然后使用长度为indices的向量替换new.matrices中对应的元素。 - hadley
1
我敢打赌,有更好的方法来构建你计划生产的存储对象。你是否打算以后用某个计算出的矩阵替换每个new.matrices[[k]]?(存储N个相同数据的副本似乎没有太多意义)如果是这样,就没有必要预先创建每个列表条目。下一个问题:你真的需要一个列表吗?还是一个三维数组allmatrices[i,j,k]就足够了,其中每一层都是oldmatrix - Carl Witthoft
矩阵有2行n列,存储个体基因信息。这里发生的是通过孢子的无性繁殖。列数取决于基因数量 - 基因可以复制或删除。每个new.matrices在各种突变过程后都会发生变化。因此,对于old.matrix[[1]] - 假设它产生了20个后代,在经过突变过程的函数之前,它会被放入新矩阵中20次。为了结果目的,该列表还会在每个模拟周期复制到结果列表中。 - SJWard
你说得对,层必须是相同的大小,但你确实说过你将相同的矩阵放入每一层。除非你的基因处理会改变矩阵的大小,否则这不应该有影响。 - Carl Witthoft
其中一个过程是基因的删除或复制,这最终会改变个体矩阵中的列数。 - SJWard
1个回答

2
也许你已经解决了你的问题,不过,你的代码存在问题。
new.matrices[indices] <- old.matrix

这个问题是由于尝试用一个矩阵替换一些对象(即你的new.matrices列表中的NULL元素)而引起的。所以Rold.matrix强制转换为向量,并尝试将每个单值粘贴到不同的列表元素中(这就是你得到这个结果的原因,当reps为4或8且old.matrix不是2 x 2矩阵时,你也会收到warning)。做法:

new.matrices[indices] <- list(old.matrix)

代码 R 会自动复制单元素列表 list(old.matrix) "reps" 次。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接