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
相关产品推荐
相关产品推荐

