【发布时间】:2013-09-12 11:44:38
【问题描述】:
我刚刚完成了对多组数据的长时间运行分析(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 很好地做到这一点),所以我认为这会工作。
编辑:这似乎只适用于函数体:
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)
}
为什么这在函数中有效,而在顶层环境中无效?
【问题讨论】:
标签: r foreach environment