Pep*_*epy 9 multicore r fifo knitr mclapply
我想监视嵌入在knitr文件中的一些非常冗长的并行计算.
计算依赖于我编写的包,相关函数使用多核包中的mclapply 进行并行化.该函数输出进度条监视使用的稍加修改的实施的计算的进展txtProgressBar从utils的包.进度条打印到终端,并在每次mclapply迭代完成时通过fifo连接进行更新.
当从文件中获取或直接调用函数时,这种方法很好,但是我发现无法在knitr中使用它.我已经尝试了相关的块选项,我可以将消息和警告重定向到终端,但不是进度条.有人可以帮忙吗?
很抱歉没有提供最小的工作示例,但我不知道如何在此设置中制作一个.
因为txtProgressBar()写入stdout,并knitr捕获stdout中的所有内容,所以目前要显示进度条并不容易,如果它是基于文本的并写入stdout.也许我可以在evaluate::evaluate(debug = TRUE)内部使用来实现你想要的东西,但我不完全确定它是否适用于文本进度条.
我现在的建议是:
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