блестящий дебод не рендерит начальный сюжет - PullRequest
1 голос
/ 01 апреля 2019

Если я добавлю отладку в реактивное выражение get_data (), то при первом получении данных график не будет отображаться. Однако изменение данных (путем выбора нового mpg) приводит к тому, что график затем отображается. Почему это? Есть ли обходной путь? Вот простой минимальный пример, демонстрирующий проблему. Попробуйте удалить %>% 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)
}

1 Ответ

0 голосов
/ 02 апреля 2019

Пара вещей здесь происходит.Я не думаю, что нам разрешено иметь дубликаты в выбранном входе.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)) Это все еще вызывало проблемы.

...