1. ホーム
  2. r

dopar%使用時の印刷方法を教えてください。

2023-08-21 01:59:02

質問

私は foreach を使用するループがあります。 %dopar%doSNOW をバックエンドとします。ループが反復するたびに何かを出力するにはどうしたらよいでしょうか?

以下の私のコードは私が現在使用しているものですが、それは何も印刷しません。

foreach(ntree=rep(25,2),.combine=combine,.packages='randomForest',
    .inorder=FALSE) %dopar% {
        print("RANDOM FOREST")
        randomForest(classForm,data=data,na.action=na.action,do.trace=do.trace,ntree=ntree,mtry=mtry)
    }   

どのように解決するのですか?

ここには多くの良い解決策が投稿されていますが、私は、ソケットにログを記録し、別のプロセスを使ってログ呼び出しをコンソールに出力するのが最も簡単だと思います。

私は以下の関数を使用しています。

log.socket <- make.socket(port=4000)

Log <- function(text, ...) {
  msg <- sprintf(paste0(as.character(Sys.time()), ": ", text, "\n"), ...)
  cat(msg)
  write.socket(log.socket, msg)
}

というように、コード内にログ文を配置することができます。

Log("Processing block %d of %d", i, n.blocks)

ログ出力は、簡単なソケットリスニングツールを使ってリアルタイムに見ることができます。例えば、Linuxでnetcatを使用します。

nc -l 4000

上記のログ文は、netcatターミナルに次のように表示されます。

2014-06-25 12:30:45: Processing block 2 of 13

この方法は、リモートで作業できる利点があり、ログに残したいだけの詳細な出力を提供します。

p.s. Windows をお使いの方は Jon Craton の netcat ポート .

p.p.s を推測しています。 write.socket R関数はおそらくスレッドセーフではありませんが、高い頻度でログを記録していない限り、問題に遭遇することはまずないでしょう。しかし、注意しなければならないことがあります。