Knitr:将块码输出重定向到终端

Pep*_*epy 9 multicore r fifo knitr mclapply

我想监视嵌入在knitr文件中的一些非常冗长的并行计算.

计算依赖于我编写的包,相关函数使用多核包中的mclapply 进行并行化.该函数输出进度条监视使用的稍加修改的实施的计算的进展txtProgressBarutils的包.进度条打印到终端,并在每次mclapply迭代完成时通过fifo连接进行更新.

当从文件中获取或直接调用函数时,这种方法很好,但是我发现无法在knitr中使用它.我已经尝试了相关的块选项,我可以将消息和警告重定向到终端,但不是进度条.有人可以帮忙吗?

很抱歉没有提供最小的工作示例,但我不知道如何在此设置中制作一个.

Yih*_*Xie 7

因为txtProgressBar()写入stdout,并knitr捕获stdout中的所有内容,所以目前要显示进度条并不容易,如果它是基于文本的并写入stdout.也许我可以在evaluate::evaluate(debug = TRUE)内部使用来实现你想要的东西,但我不完全确定它是否适用于文本进度条.

我现在的建议是:

  • 使用基于GUI的进度条 tcltk::tkProgressBar()
  • 将进度写入其他地方,例如(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)
    ```
    
    Run Code Online (Sandbox Code Playgroud)
  • 或者在代码块之外使用你的函数,例如\Sexpr{my_multicore_function()}在内联表达式中(例如在Rnw或`r my_cool_fun()`Rmd中),因为内联评估不会捕获stdout