parSapply() を使う
以前、次のゲームを行いました。
- 初期化:
total = 0。 - サイコロを 1 回振り、
totalに加算します。 totalが偶数なら、totalを 0 にリセットします。totalが 10 より大きくなったら、ゲーム終了です。
このゲームは play() 関数でシミュレーションできます。
play <- function() {
total <- no_of_rolls <- 0
while(total < 10) {
total <- total + sample(1:6, 1)
# If even. Reset to 0
if(total %% 2 == 0) total <- 0
no_of_rolls <- no_of_rolls + 1
}
no_of_rolls
}
ゲームを 100 回シミュレーションするには、for ループや sapply() を使えます。
res <- sapply(1:100, function(i) play())
これは並列実行に最適です!
関数をクラスターで使えるようにするには、clusterExport() を使います。これは、クラスターと、エクスポートする関数名の文字列を受け取ります。
clusterExport(cl, "some_function")
この演習はコースの一部です
効率的なRコードの書き方
演習の手順
play() 関数はワークスペースに定義されています。
makeCluster()を使ってクラスターを作成し、使用するコア数を 2 に設定してください。結果はclとして保存します。play()関数をクラスターにエクスポートします。- 上の
sapply()関数を書き換えて、parSapply()を使うようにします。 stopCluster()を使ってクラスターを停止します。
実践的なインタラクティブ演習
このサンプルコードを完成させて、この演習に挑戦してみましょう。
library("parallel")
# Create a cluster via makeCluster (2 cores)
cl <- ___
# Export the play() function to the cluster
___
# Re-write sapply as parSapply
res <- sapply(1:100, function(i) play())
# Stop the cluster
___