LoginSignup
6
2

More than 5 years have passed since last update.

foreach の registerDoSEQ() について #rstatsj

Last updated at Posted at 2014-09-24

大仏様の
foreachパッケージで、並列化する/しないを綺麗に書き分ける
を読んで、私がよく使っている registerDoSEQ() について書き留めておこうと思った。

例えば、次のようなコードがあったとして

cl <- makeCluster(detectCores())
registerDoParallel(cl)
foreach(i = 1:3) %dopar% {
  sqrt(i)
}
stopCluster(cl)

デバッグしたいときには並列化を解除したくなったりする。で、こう

# cl <- makeCluster(detectCores())
# registerDoParallel(cl)
foreach(i = 1:3) %do% {
  sqrt(i)
}
# stopCluster(cl)

書き換えたりするのはめんどくさい。

そこで、registerDoSEQ() という関数があって、これは registerDoParallel() の代わりに使うと foreach を強制的に並列化解除してくれる。

これで並列化を切り替えたいときには、デバッグフラグ debug を用意して次のように書けばよい。

debug <- TRUE

if(debug) {
  cl <- makeCluster(0)
  registerDoSEQ()
} else {
  cl <- makeCluster(detectCores())
  registerDoParallel(cl)
}
foreach(i = 1:3) %dopar% {
  print(i) # debug print
  sqrt(i)
}
stopCluster(cl)

ポイントは %dopar%%do% に書き替えなくてもいいということだ。
これで並列化の切り替えを自由に行えるようになった。

ご参考まで。

関連記事

6
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
6
2