我的默認回答「那麼不這樣做」(使用foreach) (可靠!)給你。
但正如@Spacedman指出的那樣,如果您想留在doFoo
/foreach家族中,Renaud的新doRNG是您正在尋找的。
儘管真正的關鍵是通過clusterApply風格的調用來獲取在所有節點上設置的種子。並且以跨越流的方式進行協調。哦,我有沒有提到Tierney,Rossini,Li和Sevcikova的snow已經爲你做了近十年?
編輯:雖然你並沒有問snow,爲了完整性這裏是在命令行的例子:
[email protected]:~$ r -lsnow -e'cl <- makeSOCKcluster(c("localhost","localhost"));\
clusterSetupRNG(cl);\
print(do.call("rbind", clusterApply(cl, 1:4, \
function(x) { stats::rnorm(1) })))'
Loading required package: utils
Loading required package: utils
Loading required package: rlecuyer
[,1]
[1,] -1.1406340
[2,] 0.7049582
[3,] -0.4981589
[4,] 0.4821092
[email protected]:~$ r -lsnow -e'cl <- makeSOCKcluster(c("localhost","localhost"));\
clusterSetupRNG(cl);\
print(do.call("rbind", clusterApply(cl, 1:4, \
function(x) { stats::rnorm(1) })))'
Loading required package: utils
Loading required package: utils
Loading required package: rlecuyer
[,1]
[1,] -1.1406340
[2,] 0.7049582
[3,] -0.4981589
[4,] 0.4821092
[email protected]:~$
編輯:以及物品是否完整,這裏就是你們的榜樣合併什麼是在文檔爲doRNG
> library(foreach)
R> library(doMC)
Loading required package: multicore
Attaching package: ‘multicore’
The following object(s) are masked from ‘package:parallel’:
mclapply, mcparallel, pvec
R> registerDoMC(2)
R> library(doRNG)
R> set.seed(123)
R> a <- foreach(i=1:2,.combine=cbind) %dopar% {rnorm(5)}
R> set.seed(123)
R> b <- foreach(i=1:2,.combine=cbind) %dopar% {rnorm(5)}
R> identical(a,b)
[1] FALSE ## ie standard approach not reproducible
R>
R> seed <- doRNGseed()
R> a <- foreach(i=1:2,combine=cbind) %dorng% { rnorm(5) }
R> b <- foreach(i=1:2,combine=cbind) %dorng% { rnorm(5) }
R> doRNGseed(seed)
R> a1 <- foreach(i=1:2,combine=cbind) %dorng% { rnorm(5) }
R> b1 <- foreach(i=1:2,combine=cbind) %dorng% { rnorm(5) }
R> identical(a,a1) && identical(b,b1)
[1] TRUE ## all is well now with doRNGseed()
R>
謝謝以雪爲例。我不熟悉R中並行編程的複雜性,所以我開始使用'foreach'從無並行代碼到並行的無痛轉換。我知道我錯過了一些東西。 – mpiktas
好吧,這就是爲什麼我們都在幾年前開始下雪,因爲從標準* apply()函數轉換到並行函數很容易:) –