首页 > 解决方案 > 如何在并行包的“应用”函数中将行更改分配给现有矩阵

问题描述

在 R 中,可以使用函数<<-内的符号lapply()为外部的变量赋值lapply()

让我们考虑一个充满 1 的矩阵:

m<-matrix(data=1, nrow=5, ncol=5)

假设我想用赋值符号 1,2,3,4 和 5 替换每一行<<-。我可以使用函数 lapply 函数(它不是那种操作的设计函数,这只是一个例子):

lapply(X = seq(nrow(m)), FUN = function(r){
  m[r,]<<-seq(5)
})

这将起作用。

但是,如果我现在像这样使用 mclapply:

mclapply(X = seq(nrow(m)), FUN = function(r){
  m[r,]<<-seq(5)
})

矩阵 m 将保持为 1。

这个想法是将更改应用于矩阵的行,而不是创建新的行,而是将它们分配到现有的行中。唯一的限制是使用并行包中的函数(例如 mclapply(),但也许另一个函数更适合)。
同样使用该<<-符号也不是强制性的。
我怎样才能做到这一点 ?

标签: rmatrixparallel-processingassignmclapply

解决方案


您不能并行分配,因为您只是分配给矩阵的本地副本。

两种解决方案:

  1. 使用共享内存(例如使用包 {bigstatsr} 在磁盘上的矩阵;免责声明:我是作者)

  2. 不要一开始就分配。只需运行lapply(),将所有结果部分作为列表并使用do.call("rbind", list).


推荐阅读