如何将行更改分配给并行包中 '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]])
})
这里的缺点是值是按顺序分配的,但至少它们是并行计算的。但是,我不认为你打算在所有计算完成之前使用矩阵。
您不能并行分配,因为您只是分配给矩阵的本地副本。
两种解决方案:
使用共享内存(例如磁盘上的矩阵使用包 {bigstatsr};免责声明:我是作者)
首先不要赋值。只需 运行 lapply()
,将所有结果部分作为列表获取并使用 do.call("rbind", list)
.
在 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]])
})
这里的缺点是值是按顺序分配的,但至少它们是并行计算的。但是,我不认为你打算在所有计算完成之前使用矩阵。
您不能并行分配,因为您只是分配给矩阵的本地副本。
两种解决方案:
使用共享内存(例如磁盘上的矩阵使用包 {bigstatsr};免责声明:我是作者)
首先不要赋值。只需 运行
lapply()
,将所有结果部分作为列表获取并使用do.call("rbind", list)
.