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

Shiny中使用uiOutput时withSpinner无法重复显示的问题求助

解决Shiny中点击按钮后重复显示withSpinner加载动画的问题

我帮你搞定这个问题!问题出在withSpinner的默认行为上:它只会在uiOutput第一次初始化渲染时显示加载动画,当后续通过按钮点击更新内容时,它不会自动重新触发动画。我们需要调整响应式逻辑,让每次点击按钮都强制触发重新计算,从而让加载动画重复出现。

下面是修改后的完整代码:

UI.R

library(shinycssloaders)
ui <- fluidPage(
  titlePanel("Hello Shiny!"),
  fluidRow(
    column(width = 2, actionButton("actButton", "Click")),
    column(width = 6, withSpinner(uiOutput("htmlExample")))
  )
)

SERVER.R

library(shiny)
library(shinycssloaders)
server<-function(input, output) {
  # 响应按钮点击,每次点击都重新生成随机数(包含耗时操作)
  random_num <- eventReactive(input$actButton, {
    Sys.sleep(1)  # 模拟耗时操作
    runif(n = 1, min = 1e-12, max = .9999999999)
  }, ignoreNULL = FALSE)  # 设置ignoreNULL=FALSE,让初始状态也能触发一次

  # 渲染UI,依赖random_num,每次random_num更新就重新渲染
  output$htmlExample <- renderUI({
    num <- random_num()
    tags$div(
      style = "font-size:24px; padding:20px;",
      paste("生成的随机数:", round(num, 10))
    )
  })
}

关键要点说明:

  • 用eventReactive响应按钮点击:这个函数会在每次点击actButton时重新执行内部代码,包括模拟耗时的Sys.sleep(1),这样Shiny能检测到计算正在进行,从而触发withSpinner的加载动画。
  • 设置ignoreNULL = FALSE:确保应用启动时也会触发一次计算,显示初始的加载动画;如果不需要初始动画,可以去掉这个参数,这样只有第一次点击按钮时才会触发。
  • renderUI依赖响应式对象:output$htmlExample的渲染依赖random_num(),所以每次random_num更新(按钮点击),renderUI都会重新执行,此时withSpinner会捕捉到渲染的等待过程,再次显示加载动画。

这样修改后,每次点击按钮,你都会看到加载动画重新出现,直到随机数生成完成并显示出来。

内容的提问来源于stack exchange,提问作者S.Elavarasan

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 07:00:25