能否在progressr包中设置进度索引以支持回退重算?
使用progressr包实现可回退的进度汇报
你需要在计算流程中支持回退到前期步骤,并让progressr正确汇报如下进度:
step 1
step 2
step 3 oops, need to go back
step 2
step 3
step 4
done
你的原有代码无法正常工作,执行后会直接走到step4,后续无输出且产生大量警告,代码如下:
f <- function() { p <- progressr::progressor(4) i <- 0 while (i < 4) { i <- i + 1 p(message = sprintf("at step %d", i)) if (i == 3 && runif(1) < 0.5) { p(message = "Oops, need to go back") i <- 2 } Sys.sleep(1) } } handlers(global = TRUE) set.seed(123) f()
问题原因
原代码中,progressor(4)固定了总步数为4,每次调用p()会自动递增内部的进度计数(默认amount=1)。即使你手动修改了循环变量i,进度器的内部计数仍在持续累加,最终超过设定的总步数,导致警告,且回退的步骤无法被正确展示。
解决方案
通过手动控制进度的绝对数值(使用p()的value参数),而非依赖自动递增,就能实现回退步骤的进度汇报。同时需要跟踪当前执行的步骤和实际完成的步骤,确保最终走完所有必要流程:
f <- function() { # 初始化进度器,不固定总步数,或设置一个合理的最大值 p <- progressr::progressor(steps = NULL) current_step <- 1 target_steps <- 4 completed_steps <- 0 while (completed_steps < target_steps) { # 直接设置进度到当前步骤,并显示对应信息 p(message = sprintf("at step %d", current_step), value = current_step) Sys.sleep(1) # 触发回退条件 if (current_step == 3 && runif(1) < 0.5) { p(message = "Oops, need to go back", value = current_step) current_step <- 2 next # 跳过后续步骤,直接回退 } # 完成当前步骤,更新完成计数和下一步 completed_steps <- current_step current_step <- current_step + 1 } # 最后显示完成信息 p(message = "done", value = target_steps) } progressr::handlers(global = TRUE) set.seed(123) f()
说明
- 初始化
progressor时设置steps = NULL,表示不固定总步数,允许动态调整进度值; - 调用
p()时通过value参数指定当前进度的绝对位置,回退时直接修改current_step即可让进度器正确显示回退后的步骤; - 通过
completed_steps跟踪实际完成的步骤,确保最终完成所有目标步骤。
内容的提问来源于stack exchange,提问作者user2554330
相关产品推荐
相关产品推荐

