如何构建仅在点击按钮时才展示输出的Shiny应用?
问题原因
renderText()本身是响应式表达式,会自动追踪内部调用的所有响应式变量的变化。你虽然将renderText的赋值操作放在了监听input$click的observeEvent中,但首次赋值完成后,output$text对应的渲染函数就会持续监听input$number的变化,滑块拖动时就会自动更新输出,不再受按钮控制。
修复方案
有两种常用的实现方式,都可以实现仅点击按钮时才更新输出的效果:
方案1:用isolate()阻断响应依赖
在renderText内部用isolate()包裹input$number,排除滑块变化对渲染函数的触发效果:
library(shiny) ui = fluidPage( sliderInput("number", "number", value = 10, min = 0, max = 50), actionButton("click", "Change output"), textOutput("text") ) server = function(input, output, session) { observeEvent(input$click, { output$text = renderText({ isolate(input$number) }) }) } shinyApp(ui, server)
方案2:用bindEvent()直接绑定触发源(更推荐)
Shiny 1.6.0及以上版本支持bindEvent()语法,可以直接指定渲染函数的触发条件,写法更简洁直观:
library(shiny) ui = fluidPage( sliderInput("number", "number", value = 10, min = 0, max = 50), actionButton("click", "Change output"), textOutput("text") ) server = function(input, output, session) { output$text = renderText({ input$number }) |> bindEvent(input$click) } shinyApp(ui, server)
内容的提问来源于stack exchange,提问作者bird
相关产品推荐
相关产品推荐

