%dopar%将主要R过程分成几个独立的子过程。有没有办法让这些子流程与主R流程进行通信,以便可以“恢复”数据?
require(foreach)
require(doMC)
registerDoMC()
options(cores = 2 )
a <- c(0,0)
foreach(i = 1:2 ) %do% {
a[i] <- i
}
print(a) # returns 1 2
a <- c(0,0)
foreach(i = 1:2 ) %dopar% {
a[i] <- i
}
print(a) # returns 0 0
谢谢!
答案 0 :(得分:4)
您应该阅读foreach文档:
foreach和%do%/%dopar%运算符提供循环结构 可以看作是循环和lapply标准的混合体 功能。它看起来类似于for循环,它评估一个 表达式,而不是一个函数(如lapply),但它的目的是 返回值(默认情况下为列表),而不是导致 副作用。
Try this:
a <- foreach(i = 1:2 ) %dopar% {
i
}
print(unlist(a))
答案 1 :(得分:1)
如果您希望结果是数据框,可以执行以下操作:
library(data.table)
result <- foreach(i = 1:2) %dopar% {
i
}
result.df <- rbindlist(Map(as.data.frame, result))
答案 2 :(得分:0)
感谢Karl,我现在明白了'.combine'
的目的a <- foreach(i = 1:2 , .combine=c) %dopar% {
return(i)
}
print(a) # returns 1 2