我想使用foreach
函数
library(foreach)
library(doParallel)
cl <- makeCluster(2)
registerDoParallel(cl)
tempdata <- matrix(0, nrow = 10, ncol = 10)
tempdata2 <- matrix(0, nrow = 10, ncol = 10)
foreach (i = 1:9, .combine='rbind') %do% {
for (j in (i+1):10) {
tempdata[i, j] <- i+j;
tempdata2[i, j] <- i*j
}
}
当我使用%do%
时它会起作用,但是当我使用%dopar%时,我什么也得不到。
我究竟做错了什么?感谢你们。任何建议将不胜感激。
答案 0 :(得分:1)
您无法修改foreach
循环之外定义的变量,并期望将数据发送回主进程。 for
循环允许这种副作用,但它不能在并行计算中工作,除非工作者是同一进程中的线程,并且任何R并行处理包都不支持,因为R是单个螺纹的。
相反,您需要从foreach
循环的主体返回一个值,并将这些值组合起来以获得所需的结果。在您的情况下,您在foreach
循环的每次迭代中计算两个值,因此您必须将它们捆绑到列表中,这意味着您需要更复杂的组合函数。这是一种方法:
library(doParallel)
cl <- makeCluster(2)
registerDoParallel(cl)
comb <- function(...) {
mapply(rbind, ..., SIMPLIFY=FALSE)
}
r <- foreach(i=1:9, .combine='comb', .multicombine=TRUE) %dopar% {
tmp <- double(10)
tmp2 <- double(10)
for(j in (i+1):10) {
tmp[j] <- i+j
tmp2[j] <- i*j
}
list(tmp, tmp2)
}
tempdata <- r[[1]]
tempdata2 <- r[[2]]