2017-04-09 8 views
0

以下の関数を並列処理に変換する最良の方法は何ですか?ランダム生成を伴う並列アプリケーション

myapply <- function(n, FUN, ...) { 
    lapply(1:n, function(i) { FUN(...) }) 
} 

ランダム生成に使用される他の関数で実行する必要があります。

myapply(100, function(...) rnorm(100, ...), 1, 1) 

ですから、ランダムな種を正しく処理するために必要です。さらに、コードを移植性とプラットフォームに依存しないようにしたいので、parallel::mcapplyは私のためには機能しません。私はforeachdoParalleldoRNGと考えていましたが、現在はdoRNGがCRANのWindowsでは利用できず、3年間更新されていませんでした。私はparallel::parLapplyと考えていましたが、私はclusterExportをエクスポートする要素の閉じたリストを持っていません(this implementation、またはhereが見つかりましたが、私はもっと単純なものを望んでいました)。

+0

(https://cran.r-project.org/web/packages/future /index.html)パッケージ:[NEWS](https://github.com/HenrikBengtsson/future/blob/1b93c3425e290971712c8f220f9a63ac67fdadc0/NEWS#L34-L44)ファイルは、並列RNG使用による再現性について語っています。 – r2evans

答えて

1

futureパッケージ(私は著者だ)のfuture_lapply()機能も何parallel::mclapply()用途でL'Ecuyer、CMRG RNGストリームを使用して並列のRNGを提供します。並列バックエンドに関係なく、すべてのOSで同じように動作します。

Windowsを含むすべてのOS、上の次の作品:あなたは[ `future`]を使用することができるかもしれません

myapply <- function(n, FUN, ...) { 
    future_lapply(1:n, function(i, ...) { 
    FUN(...) 
    }, ..., future.seed = TRUE) 
} 

library("future") 
plan(multiprocess) 

y <- myapply(100, function(...) rnorm(100, ...), mean = 1, sd = 1) 
+0

これは素晴らしいことです!私は未来について聞いたことがありますが、それに慣れる時間はありませんでした。 – Tim

関連する問題