文系なのに統計家

とある文系院生による備忘録

Rの進捗バーで複数の繰り返しを表示する

階層モデルなどをMCMCで回していて「for文の中にfor文があって、その中にまたfor文があって、…」というコードの進捗を一気に確認したいなんてことを思う人もいるんじゃないでしょうか。
私は思いました。

しかしwebを探してみてもfor文一つだけのやり方ならいくつかあったんですが複数のものは見つからず。
tcltkのパッケージヘルプを見ても何一つわからない。

ということで自分で色々いじって何とか見つけました。
以下ソースコード

library(tcltk)  #library(tcltk2) is also OK

for(h in 1:3){
  for(i in 1:5){
    pb<-winProgressBar(title="PROGRESS",label="0 done",min=0,max=100,initial=0)
    for(j in 1:100){
      Sys.sleep(0.01)
      info<-sprintf("iter:%d prod:%i house:%o done",j,i,h)
      setWinProgressBar(pb,j,label=info) 
    }
    close(pb)
  }
}


イメージとしては消費者3人、ブランドが5つ、計15個のパラメーターを100回のiterationで推定するコードという感じです。

まず

winProgressBar(title="PROGRESS",label="0 done",min=0,max=100,initial=0)

で進捗バーのウィンドウを作ります。
この時のminとmaxは一番内側にあるfor文に合わせてください。


次に一番内側のfor文の中で

sprintf("iter:%d prod:%i house:%o done",j,i,h)

で進捗バーのウィンドウに表示する情報を指定します。
" "の後ろにあるj、i、hは表示したい繰り返しの変数です。
" "の中ですが、iter:、prod:、house:、doneはそのまま表示されます。
%d、%i、%oがそれぞれj、i、hのその時点の値を返します。(つまり進捗)

ここでややこしいのがprod:%iのiとj、i、hのiは別物ということ。
sprintfの関数ヘルプにも載ってますが、整数の時に使えるのはd、i、o、x、Xの5つらしいです。(この5つも厳密には違うっぽいけどわからん)

setWinProgressBar(pb,j,label=info) 

では進捗バーそのものを指定するので2番目の引数はjです。
つまりiとhをgivenにしてjが動く進捗バーを繰り返し何度も作るという感じです。(←ベイズ的な言い回し)

close(pb)

最後にこれを忘れずに。
さもないと繰り返しの数だけウィンドウが無数に出てきてしまいます。
openloadじゃないんだから。
でもこういうポップアップに臆せずサイトにとどまる人にこそ良い動画は訪れるのだと思います。



で、これを実行するとこんな感じの進捗バーが出てきます。
f:id:electroworld1223:20161015020214j:plain



ここまで書いといてなんですが、別に一番外側の繰り返しだけ確認してれば進捗分かるじゃん、という声もありますよね。
でも違うんです。
全く動かない進捗バーを見るよりも、たとえ負荷がかかっていようと常に動いている進捗バーを見ている方が安心するんです。


ビッグデータ時代の到来から数年、データ量やパラメータの数は増加していくばかり。
コンピュータに負荷はかけても分析者の心にまで負荷をかけてはいけません。
一日の始まりに、元気に動く進捗バーを確認して、佳き統計ライフを過ごしましょう!