按钮对 Shiny 应用程序中 slideBar 输入的更改没有反应

Button is not reactive to changes to slideBar input in Shiny app

我试图让 shiny 在用户单击操作按钮后对滑动条值进行计算。单击操作按钮后,应用程序应显示一条消息。目前我得到了以下代码运行,但是当你第一次点击Action Button后,它会在响应式滑动条发生变化时自动重新执行。有人建议每次滑动条输入更改时都必须单击操作按钮吗?

shinyApp(
  ui = fluidPage(
    div(
      id = "form",
      sliderInput("popDensity", "What is the population density?", value=0, min=0, max=1500),
      
      actionButton("button", "Evaluate", style="color: #fff; background-color: #337ab7; border-color: #2e6da4")
      
    ),
    div(
      id = "sidebar",
      sidebarPanel(
                   uiOutput("calculation")   ) )
  ),
  
  server = function(input, output) {
    likelihood<-reactive({(1/500)*input$popDensity})
    
    observeEvent(input$button, {
      
      output$calculation<-renderUI({
        if (likelihood()>1) {
          a <- paste("<span style=color:red> be careful! </span>")
        }
          else if (likelihood()>.65){
            a <- paste("<span style=color:orange> be careful! </span>")
          }
        else if (likelihood()>.35){
          a <- paste("<span style=color:yellow> be careful! </span>")
        }
        else if (likelihood()>.10){
          a <- paste("<span style=color:blue> be careful! </span>")
        }
               else {
          a <- paste("<span style=color:green> be careful! </span>")
        }
        HTML(a)
        
      })
    })  
  }
)

如果您希望 UI 仅在单击按钮时更新,则 likelihood 不需要反应。所以你可以把你的服务器函数写成

  server = function(input, output) {
    observeEvent(input$button, {
      likelihood<-(1/500)*input$popDensity
      output$calculation<-renderUI({
        if (likelihood>1) {
          a <- paste("<span style=color:red> be careful! </span>")
        }
        else if (likelihood>.65){
          a <- paste("<span style=color:orange> be careful! </span>")
        }
        else if (likelihood>.35){
          a <- paste("<span style=color:yellow> be careful! </span>")
        }
        else if (likelihood>.10){
          a <- paste("<span style=color:blue> be careful! </span>")
        }
        else {
          a <- paste("<span style=color:green> be careful! </span>")
        }
        HTML(a)
      })
    })  
  }

并得到你想要的效果。

或者,如果 likelihood 由于您没有解释的原因需要保持反应,那么您需要将它与对滑块的依赖隔离开来,并将对按钮的依赖引入 renderUI 称呼。两者都很容易做到。

您可以使用 isolate:

将小部件从对输入的依赖中分离出来
likelihood<-reactive({(1/500)*isolate(input$popDensity)})

引入对按钮的依赖同样简单:只需在 renderUI 调用的任意位置添加对 input$button 的引用。这通常在调用的顶部完成:

output$calculation<-renderUI({
  input$button
  <your existing code here>
})