R блестящий: группировка событий actionButton

В моем приложении пользователи вводят 3 элемента (год, дата, станция), нажимают actionButton и получить температурный график. Без кнопки приложение работало медленно, и при каждом изменении ввода создавался новый сюжет. Поэтому я добавил кнопку, но я не уверен, что сделал это правильно. Я сделал отдельный eventReactive для всех входов, но я не могу собрать их вместе? Я попробовал несколько вещей, но не мог понять это.

Мне это нужно, потому что я пытаюсь реализовать гифки "загружаются" и "готово" этого парня (мое приложение слишком медленное, люди должны быть уверены, что что-то происходит):

https://github.com/daattali/advanced-shiny/tree/master/busy-indicator

Но с отдельными реактивными событиями гифки появляются и исчезают с каждым шагом, и они должны оставаться в течение всего actionButton процесс.

РЕДАКТИРОВАТЬ Благодаря Т. Холм я вставил isolate(), Но прежде чем я попытаюсь реализовать GIF-файлы, я должен настроить вторую часть, и я борюсь там.

РЕДАКТИРОВАТЬ 2 Я только что узнал, чтобы не запускать все внутри renderPlot в начале приложения вы можете использовать req(input$button) вместо

if(input$button == 0){return(NULL)} 
input$button

if Решение визуализировало пустой белый прямоугольник (куда придет график), в то время как с req()ничего не происходит / появляется, прежде чем нажать. Думаю, это может помочь другим людям.

Мой исправленный код:

ui <- fluidPage(
  selectInput("jaartal" , choices = 2014:2100, selected = format(Sys.Date(), "%Y")),
  uiOutput("datums")
  selectInput("weerstation", choices = list("ALDENEIK", "ALKEN")),
  actionButton("button", label = "Bereken"),
  plotOutput("plotTemp")
)

server <- function(input, output){
  # datum range
  output$datums <- renderUI({
    dateRangeInput("datums", label = h4("Periode"), 
                   start = paste(input$jaartal, "-01-01", sep = ""),
                   end = paste(input$jaartal, format(Sys.Date(), "%m"),
                               format(Sys.Date(), "%d"), sep = "-"),
                   min = paste(input$jaartal, "-01-01", sep = ""), 
                   max = paste(input$jaartal, "-12-31", sep = ""))
  })

  # plot temperatuur
  output$plotTemp <- renderPlot({
    req(input$button)
    isolate({
      importdata(input$jaartal)
      weerstation <- which(weerstations == input$weerstation)
      temperatuur(input$datums, weerstation)
    })
  })

Мое приложение показывает второй график с динамикой популяции выбранного вида. Это работало так с моим старым кодом: 1) никаких графиков при запуске. 2) нажатием кнопки создаются графики темпов и населения. 3) выбрать другой вид и сюжет корректируется сразу без кнопки. 4) когда другой вход (дата, станция) изменяется, пользователь должен нажать кнопку, чтобы настроить оба графика.

В настоящее время требования 1), 2) и 3) выполнены, а 4) нет. Когда я меняю станцию, график не перемещается = хорошо, но когда я меняю год или дату, график популяции корректируется = не хорошо. Есть идеи?

output$plotSoort <- renderPlot({
    req(input$button)
    isolate({
      importdata(input$jaartal)
      weerstation <- which(weerstations == input$weerstation)
      temperatuur(input$datums, weerstation)})
      if(input$populatie == "PER"){            
        perenbladvlo(input$datums, weerstation) # 1st species model
      }                                        
      else if(input$populatie == "OOR"){
        oorworm(input$datums, weerstation) # 2nd species model
      }
      else if(input$populatie == "FLU"){
        fluweelmijt(input$datums, weerstation) # 3rd species model
      }
  })

1 ответ

Вы можете изменить функцию отображения графика следующим образом:

  output$plotTemp <- renderPlot({
    input$button
    isolate({
      importdata(inputJaar())
      temperatuur(inputDatum(), inputStation())
    })
  })

Код в isolate будет работать только тогда, когда значение input$button изменения. Это ключевая часть реактивного программирования.

Чтобы продемонстрировать это, запустите следующий скрипт (отредактировал следующие комментарии ниже):

library(shiny)

ui <- shinyUI(fluidPage(
  selectInput("jaartal" , label = h4("Jaar"), choices = 2014:2100, selected = format(Sys.Date(), "%Y")),
  actionButton("button", label = "Bereken"),
  plotOutput("plotTemp")

))

server <- shinyServer(function(input, output){
  # datum range

  output$plotTemp <- renderPlot({
    if(input$button == 0){return(NULL)}

    input$button
    isolate({
      plot(x = 1:100,y=101:200)
        title(main=input$jaartal)
    })
  })
})

runApp(shinyApp(ui,server))
Другие вопросы по тегам