Linux下R语言progressr进度条无法被bash重定向捕获至日志
解决progressr进度条无法写入日志文件的思路
1. 强制进度条在非交互式环境输出
默认的handler_progress会检测输出是否为交互式终端(TTY),当重定向到文件时会自动抑制输出。通过设置force = TRUE可以强制输出,同时把格式里的\r替换为\n——\r是用来覆盖当前行的终端交互逻辑,日志文件无法识别,换成换行符能让每一步进度都被记录:
progressr::handlers( list(progressr::handler_progress( format = ":spin :current/:total (:message) -- [:bar] :percent in :elapsed ETA: :eta\n", width = 60, complete = "+", force = TRUE, # 强制非交互式环境输出 stream = stdout() # 指定输出到标准输出,确保被重定向捕获 )) )
2. 调整R的输出缓冲策略
非交互式模式下R的标准输出是块缓冲,进度更新不会实时写入文件。在脚本开头添加以下代码强制行缓冲,让每一次进度更新立即写入日志:
options(stdout = file(stdout(), "w", buffering = 1))
3. 改用文件友好的进度处理器
如果不需要动态覆盖的进度条效果,可以直接使用handler_txtprogress——它专门为文本/文件输出设计,默认会以换行形式输出每一步进度,无需额外配置:
progressr::handlers(handler_txtprogress())
4. 优化命令执行方式
尝试用Rscript代替直接调用R,脚本模式下的输出行为更稳定:
Rscript ~/test.R >> output.log 2>&1
完整修改后的测试脚本
# 强制行缓冲 options(stdout = file(stdout(), "w", buffering = 1)) require(progress) require(progressr) slow_sum <- function(x) { p <- progressr::progressor(along = x) sum <- 0 for (kk in seq_along(x)) { Sys.sleep(1) sum <- sum + x[kk] p(message = sprintf("Adding %g", x[kk])) } sum } progressr::handlers( list(progressr::handler_progress( format = ":spin :current/:total (:message) -- [:bar] :percent in :elapsed ETA: :eta\n", width = 60, complete = "+", force = TRUE, stream = stdout() )) ) progressr::with_progress(y <- slow_sum(1:10))
内容的提问来源于stack exchange,提问作者Burak Oker
相关产品推荐
相关产品推荐

