gpt4 book ai didi

r - Knit:将 block 代码输出重定向到终端

转载 作者:行者123 更新时间:2023-12-01 19:28:14 26 4
gpt4 key购买 nike

我想监控嵌入在 knit 文件中的一些相当冗长的并行计算。

计算依赖于我编写的一个包,相关函数使用multicore包中的mclapply进行并行化。此函数使用 utils 包中稍微修改的 txtProgressBar 实现输出进度条以监视计算进度。每次 mclapply 迭代完成时,进度条都会打印到终端并通过 fifo 连接进行更新。

当从文件中获取或直接调用函数时,这工作得很好,但我找不到办法让它在knitr中工作。我已经尝试了相关的 block 选项,我可以将消息和警告重定向到终端,但不能获取进度栏。有人可以帮忙吗?

很抱歉没有提供一个最小的工作示例,但我不知道如何在这种情况下制作一个示例。

最佳答案

因为 txtProgressBar() 写入 stdout,而 knitr 捕获 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)
    ```
  • 或者在代码块之外使用您的函数,例如在内联表达式中(例如 Rnw 中的 \Sexpr{my_multicore_function()} 或 Rmd 中的 `r my_cool_fun()`),因为内联求值不会捕获 stdout

关于r - Knit:将 block 代码输出重定向到终端,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20009152/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com