блестящий дебаунс не отображает начальный сюжет

Если я добавлю противодействие к реактивному выражению get_data (), при первом извлечении данных график не отобразится. Однако изменение данных (путем выбора нового значения миль на галлон) вызывает рендеринг графика. Почему это? Есть ли обходной путь? Вот простой минимальный пример, демонстрирующий проблему. Попробуйте удалить %>% debounce(500), чтобы убедиться, что без него он работает должным образом:

if (interactive()) {
  options(device.ask.default = FALSE)

  library(shiny)
  library(magrittr)

  ui <- fluidPage(
    selectInput("select", label = "select mpg", choices = c(mtcars$mpg, ""), selected = ""),
    plotOutput("plot")
  )

  server <- function(input, output, session) {
    get_data <- reactive({
      req(input$select)
      mtcars[mtcars$mpg == input$select,]
      }) %>% debounce(500)

    get_plot <- reactive({
      data <- get_data()
      print(data)
      plot(get_data())
      }) 

      output$plot <- renderPlot({
        get_plot()
      })
  }

  shinyApp(ui, server)
}

person sebdalgarno    schedule 01.04.2019    source источник


Ответы (1)


Здесь происходит несколько вещей. Я не думаю, что нам разрешено иметь дубликаты в выбранном вводе. mtcars$mpg содержит повторяющиеся значения. Установка начального значения на "" также вызывает странное поведение. Если вы действительно хотите, чтобы начальный сюжет был пустым вместе с debounce, мы могли бы установить его на " ". Вот как бы это выглядело.

if (interactive()) {
  options(device.ask.default = FALSE)

  library(shiny)
  library(magrittr)

  ui <- fluidPage(
    selectInput("select", label = "select mpg", choices = c(" ",unique(mtcars$mpg)),selected = " "),
    plotOutput("plot")
  )

  server <- function(input, output, session) {
    get_data <- reactive({
      req(input$select)
      if(!is.na(as.numeric(input$select))) mtcars[mtcars$mpg == input$select,] else NULL
    }) %>% debounce(500)

    get_plot <- reactive({
      req(get_data())
      data <- get_data()
      print(data)
      plot(get_data())
    }) 

    output$plot <- renderPlot({
      get_plot()
    })
  }

  shinyApp(ui, server)
}

В противном случае, если у вас все в порядке с начальным сюжетом, следующие работы. Обратите внимание на важность использования unique()

if (interactive()) {
  options(device.ask.default = FALSE)

  library(shiny)
  library(magrittr)

  ui <- fluidPage(
    selectInput("select", label = "select mpg", unique(mtcars$mpg)),
    plotOutput("plot")
  )

  server <- function(input, output, session) {
    get_data <- reactive({
      req(input$select)
      mtcars[mtcars$mpg == input$select,]
    }) %>% debounce(500)

    get_plot <- reactive({
      req(get_data())
      data <- get_data()
      print(data)
      plot(get_data())
    }) 

    output$plot <- renderPlot({
      get_plot()
    })
  }

  shinyApp(ui, server)
}

Я даже попытался заменить ввод выбора на selectizeInput("select", label = "select mpg", choices = unique(mtcars$mpg),multiple = TRUE,options = list(maxItems = 1)). Это все еще вызывало проблемы.

person Sada93    schedule 01.04.2019
comment
Кажется, это работает для моего представителя, поэтому я дал ответ. Однако для моего более сложного приложения это все еще не работает. Я попытаюсь восстановить пример, в котором ваше решение не работает. - person sebdalgarno; 05.04.2019
comment
В моем более сложном приложении мне пришлось удалить req в реакциях, чтобы загрузился начальный график. Я использовал проверку как обходной путь без запроса. - person dchen71; 27.06.2019