Snow ワーカーによって生成された出力はデフォルトで破棄されますが、makeCluster の「outfile」オプションを使用して変更できます。outfile を空の文字列 ("") に設定すると、snow が出力をリダイレクトするのを防ぎ、多くの場合、印刷メッセージからの出力がマスター プロセスのターミナルに表示されます。
次のような方法でクラスターを作成して登録するだけです。
library(doSNOW)
cl <- makeCluster(4, outfile="")
registerDoSNOW(cl)
foreach ループを変更する必要はまったくありません。
これは、Open MPI で構築された Rmpi を使用する SOCK クラスターと MPI クラスターの両方で機能します。Windows では、Rgui を使用している場合、出力は表示されません。代わりに Rterm.exe を使用すると、そのようになります。
独自の出力に加えて、snow によって生成されたメッセージも表示されることに注意してください。これも役立ちます。
プログレスバーを使用するには、doSNOW バージョン 1.0.14 にprogress
オプションがあります。完全な例を次に示します。
library(doSNOW)
library(tcltk)
library(randomForest)
cl <- makeSOCKcluster(3)
registerDoSNOW(cl)
ntasks <- 100
pb <- tkProgressBar(max=ntasks)
progress <- function(n) setTkProgressBar(pb, n)
opts <- list(progress=progress)
x <- matrix(runif(500), 100)
y <- gl(2, 50)
rf <- foreach(ntree=rep(25, ntasks), .combine=combine,
.multicombine=TRUE, .packages='randomForest',
.options.snow=opts) %dopar% {
randomForest(x, y, ntree=ntree)
}
このprogress
オプションは非常に一般的であるため、次のような関数を使用して単純にメッセージを出力できます。
progress <- function(n) cat(sprintf("task %d is complete\n", n))
この関数は、0、1、または 2 つの引数を取ることができます。最初に指定された引数は完了したタスクの総数で、2 番目は完了したばかりのタスクのタスク番号です。
最も単純な例は.
、タスクが完了したときに a を出力するだけです。
progress <- function() cat('.')
この例では両方の引数が表示されており、タスクが常に順番どおりに完了するとは限らないことを示すために使用できます。
progress <- function(nfin, tag) {
cat(sprintf('tasks completed: %d; tag: %d\n', nfin, tag))
}