Кнопка не реагирует на изменения ввода ползунка в приложении Shiny - PullRequest
0 голосов
/ 06 августа 2020

Я пытаюсь позволить shiny производить расчет со значением ползунка после того, как пользователь нажимает кнопку действия. После нажатия кнопки действия приложение должно показать сообщение. На данный момент у меня запущен следующий код, но после того, как вы впервые нажмете кнопку «Действие», он автоматически выполнится повторно при изменении реактивных ползунков. Есть ли у кого-нибудь предложение сделать так, чтобы кнопку действия нужно было нажимать каждый раз при изменении ввода ползунка?

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)
        
      })
    })  
  }
)

1 Ответ

0 голосов
/ 06 августа 2020

Если вы хотите, чтобы пользовательский интерфейс обновлялся только при нажатии кнопки, то 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)})

Ввести зависимость от кнопки так же просто: просто добавьте ссылка на input$button в любом месте вызова renderUI. Часто это делается в начале вызова:

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