Мы должны быть осторожны, когда используем 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)