2013-11-15 79 views
8

我想監視嵌入在knitr文件中的一些非常冗長的並行計算。Knitr:將塊代碼輸出重定向到終端

計算依賴於我編寫的程序包,相關函數使用來自多核的包中的mclapply進行並行化。此函數輸出進度條以監視計算的進度,使用稍微修改的txtProgressBar實用程序包。進度條被打印到終端並且每次迭代mclapply完成時通過fifo連接進行更新。

當從文件中獲取或直接調用函數時,此工作正常,但是我發現無法使其在knitr中工作。我已經嘗試了相關的塊選項,我可以將消息和警告重定向到終端,但不是進度條。誰能幫忙?

對不起,沒有提供一個最小的工作示例,但我沒有看到我怎麼能在這個設置。

回答

6

因爲txtProgressBar()寫入到標準輸出,而knitr捕獲標準輸出中的所有內容,因此目前如果它是基於文本並寫入標準輸出的話,顯示進度條並不容易。也許我可以在內部使用evaluate::evaluate(debug = TRUE)來實現您想要的效果,但我不完全確定它是否適用於文本進度條。

我當時的建議是:

  • 使用像tcltk::tkProgressBar()
  • 基於GUI的進度條寫進度到其他地方,例如使用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) 
    ``` 
    
  • 或使用功能的代碼塊外的,例如(AB)在內嵌式(如在荷廣\Sexpr{my_multicore_function()}`r my_cool_fun()`在RMD),因爲行內評價不捕獲標準輸出

+0

感謝您的回覆@Yihui,我希望你能放下!我會沿着第一條建議嘗試一些,第二條意味着放棄緩存計算的能力。除了多核問題之外,您是否知道有任何方法可以監視塊內進行的計算狀態? –

+1

也許您可以將進度寫入其他位置,例如在文件中:'txtProgressBar(...,file ='progress_temp.txt')'。或者寫給stderr。我會更新我的答案。 –

+0

感謝'StdErr()'破解,簡單實現並創造奇蹟。雖然我在這上面,但謝謝你,這是我每天使用的一個很棒的工具。 –

0

讀了點關於打印進度條一輝的回答標準錯誤,我建議暫時重定向stdoutstderrsink()

sink(stderr()) 

your_code() 

sink() 
相關問題