【问题标题】:Button is not reactive to changes to slideBar input in Shiny app按钮对 Shiny 应用程序中的 slideBar 输入的更改没有反应
【发布时间】:2020-11-26 09:28:52
【问题描述】:

我试图让闪亮在用户单击操作按钮后使用滑动条值进行计算。单击操作按钮后,应用程序应显示一条消息。目前我已经运行了下面的代码,但是当你第一次点击 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)
        
      })
    })  
  }
)

【问题讨论】:

    标签: html css r shiny shinyapps


    【解决方案1】:

    如果您希望 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>
    })
    

    【讨论】:

    • 谢谢!我将如何做到这一点,以使跨度线不那么多余?我只想用一行来替换它,我可以在其中替换不同的颜色。
    猜你喜欢
    • 1970-01-01
    • 2016-10-11
    • 1970-01-01
    • 2019-06-30
    • 1970-01-01
    • 2016-08-17
    • 2021-08-15
    • 2021-08-12
    • 2015-11-06
    相关资源
    最近更新 更多