複数のデータ セットに対する長時間実行分析 (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)
}
これが関数では機能するのに、トップレベル環境では機能しないのはなぜですか?