我刚刚完成对多组数据的长时间运行分析(24 小时以上)。因为我很懒,不想处理多个R
会话并将结果汇总在一起,我使用并行运行它们foreach
.
分析返回一个充满结果(和中间对象)的环境,因此我尝试将结果分配给全局环境,却发现这不起作用。下面是一些代码来说明:
library(doMC)
library(foreach)
registerDoMC(3)
bigAnalysis <- function(matr) {
results <- new.env()
results$num1 <- 1
results$m <- matrix(1:9, 3, 3)
results$l <- list(1, list(3,4))
return(results)
}
a <- new.env()
b <- new.env()
c <- new.env()
foreach(i = 1:3) %dopar% {
if (i == 1) {
a <<- bigAnalysis(data1)
plot(a$m[,1], a$m[,2]) # assignment has worked here
} else if (i == 2) {
b <<- bigAnalysis(data2)
} else {
c <<- bigAnalysis(data3)
}
}
# Nothing stored :(
ls(envir=a)
# character(0)
我在其中使用了全局分配foreach
在(在函数内)填充我事先用数据设置的矩阵(我无法很好地做到这一点).combine
),所以我认为这会起作用。
EDIT:看来这只适用于函数体内:
f <- function() {
foreach(i = 1:3) %dopar% {
if (i == 1) {
a <<- bigAnalysis(data1)
} else if (i == 2) {
b <<- bigAnalysis(data2)
} else {
c <<- bigAnalysis(data3)
}
}
d <- new.env()
d$a <- a
d$b <- b
d$c <- c
return(d)
}
为什么这在函数中有效,但在顶级环境中却不起作用?
您尝试分配给全局变量foreach
循环失败,因为它们发生在由mclapply
。这些变量不会发送回主进程,因此它们会丢失。
你可以尝试这样的事情:
r <- foreach(i = 1:3) %dopar% {
if (i == 1) {
bigAnalysis(data1)
} else if (i == 2) {
bigAnalysis(data2)
} else {
bigAnalysis(data3)
}
}
a <- r[[1]]
b <- r[[2]]
c <- r[[3]]
ls(a)
这使用默认的组合函数,该函数返回列表中的三个环境对象。
执行foreach
函数中的循环不会使其工作。但是,如果您不打电话,作业就会起作用registerDoMC
这样你实际上是按顺序运行的。在这种情况下,您实际上是在对主进程的全局环境进行分配。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)