Блестящий динами c фильтр данных - PullRequest
0 голосов
/ 24 февраля 2020

Я знаю, что уже есть некоторые вопросы по этим темам, но я все еще борюсь со своим собственным проектом.

В моем блеске есть три выбранных виджета ввода, которые должны реагировать друг на друга. Возможны только те комбинации, которые имеют смысл.

Код теперь обновляется для использования mtcars. имена некоторых переменных странные сейчас, но это должно иметь значение.

library(shiny)

ui <- fluidPage(
  selectInput(inputId = "INseason", label = "Season", choices = c("ALL", sort(unique(mtcars$am), decreasing = TRUE)), selected = NULL),
  selectInput(inputId = "INcategory",  label = "Category", choices = c("ALL", sort(unique(mtcars$gear))), selected = NULL),
  selectInput(inputId = "INteams", label = "Team", choices = c("ALL", sort(unique(mtcars$carb))), selected = NULL)

)

server <- function(input, output, session) {

  rv <- reactiveValues()
  rv$data <- mtcars

  observe({

    if(input$INseason != "ALL") {
      rv$data <- filter(rv$data, am == input$INseason)
    }
    if(input$INcategory != "ALL") {
      rv$data <- filter(rv$data, gear == input$INcategory)
    }
    if(input$INteams != "ALL") {
      rv$data <- filter(rv$data, carb == input$INteams)
    }

  })

  observe({
    updateSelectInput(session, "INseason", choices = c("ALL", sort(unique(rv$data$am), decreasing = TRUE)))
    updateSelectInput(session, "INcategory", choices = c("ALL", sort(unique(rv$data$gear))))
    updateSelectInput(session, "INteams", choices = c("ALL", sort(unique(rv$data$carb))))
  })

}

shinyApp(ui, server)

С этим кодом я не могу выбрать что-то, потому что "ВСЕ" уже выбрано.

Спасибо за вашу помощь!

Лучший

1 Ответ

0 голосов
/ 25 февраля 2020

Вы должны передать аргумент selected обратно в updateSelectInput, в противном случае он всегда будет по умолчанию иметь первую категорию (даже если что-то было выбрано).

Заменить последний блок на:

  observe({
    updateSelectInput(session, "INseason", 
                      choices = c("ALL", sort(unique(rv$data$am), decreasing = TRUE)),
                      selected = if(is.null(input$INseason)) "ALL" else input$INseason)
    updateSelectInput(session, "INcategory", 
                      choices = c("ALL", sort(unique(rv$data$gear))),
                      selected = if(is.null(input$INcategory)) "ALL" else input$INcategory)
    updateSelectInput(session, "INteams",
                      choices = c("ALL", sort(unique(rv$data$carb))),
                      selected = if(is.null(input$INteams)) "ALL" else input$INteams)
  })

(этот код может быть более аккуратным, но он работает!)

...