我正在尝试对向量并行执行具有副作用的函数。例如,在以下代码段中,add.entry
具有修改master
的副作用。
library(parallel)
master <- data.frame()
add.entry <- function(x) {
row <- data.frame(a = x, b = sin(x))
master <- rbind(master, row)
}
mclapply(1:42, add.entry)
我得到的输出是
[[1]] a b 1 1 0.841471
[[2]] a b 1 2 0.9092974
[[3]] a b 1 3 0.14112
[[4]] a b 1 4 -0.7568025
但是,master
之后没有任何内容。我最好的猜测是其中涉及一些比赛条件。我该如何解决,例如可能声明一个关键部分?
答案 0 :(得分:1)
rbind()
到全局环境中的master
,而会在不同的分支中访问它的某些副本(参见https://privefl.github.io/blog/a-guide-to-parallelism-in-r/)。 / li>
mclapply
已经返回了某些内容(例如lapply
)。 您可以轻松完成
library(parallel)
add.entry <- function(x) {
data.frame(a = x, b = sin(x))
}
res_list <- mclapply(1:42, add.entry)
master <- do.call("rbind", res_list)