You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

EDP服务器Shiny应用中progressr进度条不更新问题求助

解决Shiny服务器端progressr进度条不更新问题

问题背景

我在EDP服务器上使用rocker/shiny:4.2.2镜像运行Shiny应用,应用中用到多个future.apply功能,通过progressr展示进度条。核心代码如下:

withProgressShiny(
    message = "Collecting results ",
    detail = "initialization",
    {
      p <- progressor(steps = 100)
      counter = 0
      while(counter < 100){
        counter=counter+1
        p(message = "searching")
      }
    })

本地测试时,无论使用future::plan(sequential)、multisession还是multicore,进度条都能正常更新;但服务器端仅停留在“initialization”阶段,循环中的“searching”进度完全不更新。本地与服务器的R版本及所有依赖包版本均一致,推测问题出在progressor()而非withProgressShiny()部分。

解决建议

  • 强制注册进度处理程序:在服务器端Shiny应用的初始化代码中,显式启用progressr并注册Shiny处理器,避免环境默认配置缺失:
    options(progressr.enable = TRUE)
    progressr::handlers(progressr::handler_shiny())
    
  • 确保future进程的进度对象传递:使用future.apply时,需要让子进程能访问到进度对象p。可以在设置future计划时指定全局变量传递,或者在调用future_lapply时开启全局变量继承:
    future::plan(future::multisession, globals = TRUE)
    # 或者在future_lapply中指定
    future.apply::future_lapply(data, function(item) {
      p(message = "searching")
      # 业务逻辑代码
    }, globals = list(p = p))
    
  • 强制刷新Shiny会话:在调用p()更新进度后,手动触发Shiny会话的UI刷新,避免服务器端缓冲延迟更新:
    withProgressShiny(
        message = "Collecting results ",
        detail = "initialization",
        {
          p <- progressor(steps = 100)
          counter = 0
          while(counter < 100){
            counter=counter+1
            p(message = "searching")
            session$flushReact()  # 需确保session对象已传入当前环境
          }
        })
    
  • 切换future计划类型:服务器端使用multicore计划可能因进程隔离导致进度信号无法传递回主进程,尝试切换为multisession计划测试:
    future::plan(future::multisession)
    
  • 关闭输出缓冲:部分服务器环境开启了输出缓冲,导致进度消息无法即时推送,可添加以下代码强制刷新:
    options(stdout = file())
    flush.console()
    

内容的提问来源于stack exchange,提问作者Marcel

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.11 22:41:35