始める無料で始める

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
___
コードを編集して実行