1

在 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(),但也许另一个函数更适合)。
同样使用该<<-符号也不是强制性的。
我怎样才能做到这一点 ?

4

2 回答 2

1

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

两种解决方案:

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

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

于 2020-02-05T18:15:05.087 回答
1

这个怎么样,使用future包

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]]) 
})

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

于 2020-02-05T17:56:20.117 回答