如何将行更改分配给并行包中 'apply' 函数中的现有矩阵

How to assign row changes to an existing matrix within an 'apply' function from the parallel package

在 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(),但也许另一个函数更适合)。
此外,使用 <<- 符号不是强制性的。
我该怎么做?

怎么样,使用 future package

library(future)
plan(multiprocess) 

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

# we create a set of futures, so the values are calculated in parallele and
# not sent back to the main environment
fs <- lapply(seq(nrow(m)), function(x) future(seq(5) + x))

# when then pull the values one by one and apply them where they belong
for (i in seq(nrow(m))) {
  m[i, ] <- value(fs[[i]])
}

# or the same way you did it:
lapply(X = seq(nrow(m)), FUN = function(r){
  m[r,] <<- value(fs[[r]]) 
})

这里的缺点是值是按顺序分配的,但至少它们是并行计算的。但是,我不认为你打算在所有计算完成之前使用矩阵。

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

两种解决方案:

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

  2. 首先不要赋值。只需 运行 lapply(),将所有结果部分作为列表获取并使用 do.call("rbind", list).