Как получить updateSelectionInput Shiny для обновления со списком значений - PullRequest
0 голосов
/ 18 февраля 2019

Я пытаюсь заполнить список на основе предыдущего выбора пользователя.Например, если пользователь выбирает «B1_B2» из моего второго раскрывающегося списка, в третьем раскрывающемся списке должно отображаться sublist_12.Единственная проблема заключается в том, что мой код обновляет только выпадающий список с первым элементом в sublist_12.Как мне получить его, чтобы заполнить раскрывающийся список полным набором элементов?(Кроме того, я полностью открыт для более элегантных способов сделать это. Не стесняйтесь сказать мне, если это ужасно неэффективно).Спасибо!

library(shiny)

list_A <- c("A1","A2","A3")
list_B <- c("B1", "B2", "B3", "B1_B2")
sublist_1 <- c("X","Y")
sublist_2 <- c("Z")
sublist_12 <- c("foo", "boo", "zoo")

ui <- fluidPage(
  # Application title
  titlePanel("Select Category"),
  sidebarLayout(
    sidebarPanel(
      fluidRow(
        selectInput(inputId = "listA_options", label = "Select Cateroy", 
choices = c(list_A, list_B)),
        selectInput(inputId = "listB_options", label = "Select subcat1", 
choices = list_B),
        selectInput(inputId = "sublist_options", label = "Select subcat2", 
choices = NULL))),
mainPanel(  )))

server <- function(input, output, session) 
{
  #Update the Selection options
  choices_interventions <- reactive({
    choices_interventions <- ifelse(input$listB_options == "B1", sublist_1, 
                                    ifelse(input$listB_options == "B2", sublist_1,
                                           ifelse(input$listB_options == "B3", sublist_2,
                                                  ifelse(input$listB_options == "B1_B2", sublist_12))))})
  observe({
    updateSelectInput(session = session, inputId = "sublist_options", choices = choices_interventions())
  })
 }

# Run the application 
shinyApp(ui = ui, server = server)

1 Ответ

0 голосов
/ 18 февраля 2019

Мы должны быть осторожны, когда используем ifelse(), это векторизованная форма ifelse, а не просто более удобный способ написания if(condition) ... else ....

Для будущих знаний, в ifelse(condition,true,false) true иfalse оба оцениваются.Векторы тогда подмножество, используя условие.

Пример: ifelse(c(TRUE,TRUE,FALSE,FALSE,TRUE),c(1,2,3,4,5),c(6,7,8,9,10)) = [1,2,8,9,5]

В любом случае, причина, по которой он отображал только первый элемент, заключается в том, что ваше условное утверждение input$listB_options == "B1" является одномерным.Вам лучше использовать обычный if() else или даже лучше оператор switch.

library(shiny)

list_A <- c("A1","A2","A3")
list_B <- c("B1", "B2", "B3", "B1_B2")
sublist_1 <- c("X","Y")
sublist_2 <- c("Z")
sublist_12 <- c("foo", "boo", "zoo")

ui <- fluidPage(
  # Application title
  titlePanel("Select Category"),
  sidebarLayout(
    sidebarPanel(
      fluidRow(
        selectInput(inputId = "listA_options", label = "Select Cateroy", 
                    choices = c(list_A, list_B)),
        selectInput(inputId = "listB_options", label = "Select subcat1", 
                    choices = list_B),
        selectInput(inputId = "sublist_options", label = "Select subcat2", 
                    choices = NULL))),
    mainPanel(  )))

server <- function(input, output, session) {
  #Update the Selection options
  choices_interventions <- reactive({

  switch(input$listB_options,
         "B1" = sublist_1,
         "B2" = sublist_1,
         "B3" = sublist_2,
         "B1_B2" = sublist_12)
  })



  observe({
    req(choices_interventions())
    updateSelectInput(session = session, inputId = "sublist_options", choices = choices_interventions())
  })
}

# Run the application 
shinyApp(ui = ui, server = server)
...