Shiny - связь между selectInput и checkboxInput - PullRequest
0 голосов
/ 28 февраля 2019

У меня есть блестящее приложение, созданное через несколько вкладок.На первой вкладке у меня есть несколько selectInputs и флажки.

Эти объекты должны помочь в выборе внутри здания уровней и / или зон.Здание имеет несколько уровней, а каждый уровень - несколько зон.

Флажки показывают, хотите ли вы выбрать один уровень здания или нет, а selectInputs представляет конкретные зоны, которые вы хотите выбрать из этого уровня.То есть: каждый уровень имеет свой собственный флажок, и каждый флажок имеет свой собственный selectInput.

Эти входы связаны следующим образом: Когда вы нажимаете один флажок, выбираются все параметры соответствующего selectInput.

Проблема в том, что, когда я выбираю несколько зон одного selectInput с одного уровня (например, уровень 0) и после того, как я нажимаю один флажок другого уровня (уровень 1), выбранные параметры с уровня до (Уровень0) исчезают и больше не выбираются.Кажется, они связаны или как-то связаны.

Есть ли способ решить эту проблему?

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


Ниже приведена соответствующая часть пользовательского интерфейса приложения:

tabItem(tabName = "building",
        fluidRow(
          # checkbox for select all levels
          div(class = "selectall", prettyCheckbox(inputId = "selectall", label = strong("All Building Information"), 
                                                  status = "info", shape = "curve")
              )
          ), br(), 
        fluidRow(
          column(
            fluidRow(
              column(
                fluidRow(
                  div(class = "selectlevel", 
                      # checkbox for select level 0
                      prettyCheckbox(inputId = "selectlevel0", label = strong("Level 0"), 
                                     status = "info", animation = "smooth", shape = "curve", plain = T)
                      )
                  ),
                div(class = "sepselect", 
                    fluidRow(
                      # select input level 0 zones
                      selectInput(inputId = "zone0", label = "Select Zone",
                                  choices = c("zone0a","zone0b","zone0c") , multiple = TRUE)
                      )
                    ),
                width = 3),
              column(
                # image level 0 
                img(src = "level0.png", height = "220px", width = "80%", style="border:1px solid grey"),
                width = 9)
            ),
            width = 6),
          column(
            fluidRow(
              column(
                fluidRow(
                  div(class = "selectlevel", 
                      # checkbox for select level 1
                      prettyCheckbox(inputId = "selectlevel1", label = strong("Level 1"), 
                                     status = "info", animation = "smooth", shape = "curve", plain = T)
                      )
                ),
                div(class = "sepselect", 
                    fluidRow(
                      # select input level 1 zones
                      selectInput(inputId = "zone1", label = "Select Zone",
                                  choices = c("zone1a","zone1b","zone1c","zone1d","zone1e"), multiple = TRUE)
                      )
                ),
                width = 3),
              column(
                # image level 1
                img(src = "level1.png", height = "220px", width = "80%", style="border:1px solid grey"),
                width = 9)
            ),
            width = 6)
        )
        ) # close tabitem maps

Ниже приведена соответствующая часть кода длясервер:

# select all areas in each level
observe({
# level 0
if(input$selectlevel0 == TRUE){
  selected_choices <- c("zone0a","zone0b","zone0c") 
} else {
  selected_choices <- character(0)
}
updateSelectInput(session, "area0", selected = selected_choices)
# level 1
if(input$selectlevel1 == TRUE){
  selected_choices <- c("zone1a","zone1b","zone1c","zone1d","zone1e")
} else {
  selected_choices <- character(0)
}
updateSelectInput(session, "area1", selected = selected_choices)
})

# select all levels 
observe({
if(input$selectall == FALSE){
  updateCheckboxInput(session, "selectlevel0", value = F)
  updateCheckboxInput(session, "selectlevel1", value = F)
} else{
  updateCheckboxInput(session, "selectlevel0", value = T)
  updateCheckboxInput(session, "selectlevel1", value = T)
}
})

Также я предоставлю вам изображение внешнего вида приложения: Частичный вид приложения

...