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

在Shiny的global.R中加载外部对象时显示进度指示器的解决方案问询

在Shiny启动时显示数据加载进度的解决方案

你遇到的问题核心在于:withProgress 需要依赖一个有效的 ShinySession 对象,而 global.R 是在应用启动(还没有用户连接)时执行的,此时并没有可用的会话,所以直接调用会抛出那个错误。

想要在应用启动时只显示一次加载进度,同时避开非反应式上下文的限制,最靠谱的方案是把数据加载逻辑移到 server 函数内,用一个只触发一次的观察者来执行。这样既满足了在反应式上下文内调用 withProgress 的要求,又能确保加载过程只运行一次(用户首次打开应用时执行)。

具体实现代码

首先把数据加载的代码从 global.R 移到 server 函数中,用 reactiveVal 存储加载好的数据,再配合 observeEvent 设置 once = TRUE:

# global.R 里只保留文件路径的定义(如果之前是在这里的话)
vec_dta_fls <- c("path/to/file1.rds", "path/to/file2.rds")

# server.R
server <- function(input, output, session) {
  # 用反应式值存储加载完成的数据
  loaded_data <- reactiveVal(NULL)
  
  # 只在应用启动时执行一次数据加载
  observeEvent(TRUE, {
    withProgress(message = "Reading data files:", expr = {
      data_list <- lapply(seq_along(vec_dta_fls), function(i) {
        incProgress(
          amount = 1 / length(vec_dta_fls),
          message = paste("Reading file:", vec_dta_fls[i])
        )
        readr::read_rds(vec_dta_fls[i])
      })
      # 把加载好的数据存入反应式值
      loaded_data(data_list)
    })
  }, once = TRUE)
  
  # 后续在需要使用数据的地方,用 loaded_data() 获取
  output$example_plot <- renderPlot({
    # 确保数据加载完成后再执行后续逻辑
    req(loaded_data())
    
    # 这里写你的绘图/分析逻辑
    plot(loaded_data()[[1]])
  })
}

为什么这个方案可行?

  • observeEvent(TRUE, ..., once = TRUE) 会在 server 初始化时立即执行一次,之后不再触发,完美匹配「只加载一次」的需求。
  • 这段代码运行在 server 函数内,拥有有效的 ShinySession,所以 withProgress 和 incProgress 能正常工作,前端会显示动态进度条。
  • 用 reactiveVal 存储数据,后续的反应式组件(比如 renderPlot)可以通过 loaded_data() 访问,确保数据加载完成后才执行逻辑。

备选方案(控制台进度提示)

如果你坚持要在 global.R 里加载数据,那只能放弃前端进度条,改用控制台的进度提示(用户看不到,只有开发者能在R控制台看到):

# global.R
vec_dta_fls <- c("path/to/file1.rds", "path/to/file2.rds")

# 创建文本进度条
pb <- txtProgressBar(min = 0, max = length(vec_dta_fls), style = 3)
lst_dta <- lapply(seq_along(vec_dta_fls), function(i) {
  # 更新进度条
  setTxtProgressBar(pb, i)
  # 在控制台打印当前加载的文件
  message(paste("Reading file:", vec_dta_fls[i]))
  readr::read_rds(vec_dta_fls[i])
})
close(pb)

但这个方案对前端用户不友好,所以更推荐第一种方法。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 03:51:07