2013-11-15 20 views
8

knitrファイルに埋め込まれた非常に長い並列化計算を監視したい。Knitr:チャンクコード出力を端末にリダイレクト

計算は私が書いたパッケージに依存しており、関連する関数はマルチコアパッケージのmclapplyを使用して並列化しています。この関数は、utilsパッケージのtxtProgressBarのわずかに変更された実装を使用して、計算の進行を監視するプログレスバーを出力します。プログレスバーはターミナルに印刷され、mclapplyの繰り返しが完了するたびにfifo接続を介して更新されます。

これは、ファイルからのソースまたは関数の直接呼び出しではうまく動作しますが、これをknitr内で動作させる方法はありません。関連するチャンクオプションを試しましたが、メッセージと警告は端末にリダイレクトされますが、プログレスバーは取得できません。誰も助けることができますか?

申し訳ありませんが、最小限の動作例は提供していませんが、私はこの設定でどのように作成できるかわかりません。

答えて

6

txtProgressBar()がstdoutに書き込みを行い、knitrがすべてをstdoutに取り込むので、現在はテキストベースでstdoutに書き込む場合はプログレスバーを表示するのが容易ではありません。おそらく私はevaluate::evaluate(debug = TRUE)を内部的に使ってあなたが望むものを達成することができますが、それがテキストの進行状況バーとうまくいくかどうかは完全にはわかりません。現時点では

私の提案は以下のとおりです。tcltk::tkProgressBar()

  • は、例えば、他の場所への進行を書くよう

    • は、GUIベースのプログレスバーを使用します(AB)例えば、stderr

      ```{r progress} 
      pb = txtProgressBar(min = 0, max = 100, file = stderr()) 
      for (i in 1:100) { 
          setTxtProgressBar(pb, i) 
          Sys.sleep(0.05) 
      } 
      close(pb) 
      ``` 
      
    • またはコードチャンク外で機能を使用を使用して(このようRNWで\Sexpr{my_multicore_function()}またはRMDで`r my_cool_fun()`など)インライン式に、インライン評価が標準出力をキャプチャしていないため、

  • +0

    @Yihuiの返信をありがとう、私はあなたが落ちると思っていた!私はあなたの最初の提案の行に沿って何かを試みます、2番目の提案は計算をキャッシュする能力を失うことを暗示します。マルチコアの問題はさておき、チャンク内で実行される計算の状態を監視する方法は何か知っていますか? –

    +1

    おそらく、あなたはファイルのような他の場所に進捗状況を書くことができます: 'txtProgressBar(...、file = 'progress_temp.txt')'。または、stderrに書き込んでください。私は私の答えを更新します。 –

    +0

    'StdErr()'ハックのために感謝しています。私がそれをしている間、knitrのおかげで、毎日使う素晴らしいツールです。 –

    0

    は私がstdoutをリダイレクトする一時的なことをお勧めYihuiの答えに標準エラー出力にプログレスバーを印刷についてのポイントを読みましたstderrsink()

    sink(stderr()) 
    
    your_code() 
    
    sink() 
    
    関連する問題