#r #shiny
#r #блестящий
Вопрос:
В моем пользовательском интерфейсе есть 3 разных географических уровня.R: глобальный уровень (уровень 1), который содержит 3 подуровня (уровень 2), каждый из которых содержит 3 подуровня (уровень 3).
3 первых уровня уровня 3 содержатся на первом уровне уровня 2, следующие 3 уровня уровня 3 содержатся на втором уровне уровня 2, последние 3 уровня уровня 3 содержатся на третьем уровне уровня 2.
Как я могу установить все флажки, когда установлен флажок уровня 1? И если я проверю 3 первых уровня уровня 3, как автоматически проверить первый уровень уровня 2.
Вот код пользовательского интерфейса :
library(shiny)
shinyUI(navbarPage("RP 2014",
tabPanel("Sélection",
print (h4(strong("Geographical levels"))),
fluidRow(
column(width = 3,
h5(strong("Level 1")),
checkboxInput("dynamic_L1",
label = "")
), # f. column
column(width = 3,
checkboxGroupInput("dynamic_L2",
label = h5(strong("Level 2")),
choices = list("L2_1" = "Level 2-1",
"L2_2" = "Level 2-2",
"L2_3" = "Level 2-3"))
),
column(width = 3,
checkboxGroupInput("dynamic_L3",
label = h5(strong("Level 3")),
choices = list("L3_1" = "Level 3-1",
"L3_2" = "Level 3-2",
"L3_3" = "Level 3-3",
"L3_4" = "Level 3-4",
"L3_5" = "Level 3-5",
"L3_6" = "Level 3-6",
"L3_7" = "Level 3-7",
"L3_8" = "Level 3-8",
"L3_9" = "Level 3-9"))
)
)
)
)
)
Надеюсь, мой вопрос понятен, спасибо, что помогли мне.
Комментарии:
1. У меня нет полного ответа, но я бы начал с рассмотрения использования
reactive
функции, которая будет вызываться при описанных вами обстоятельствах, содержащейupdateCheckboxGroupInput
функцию для изменения выбранных входных данных.2. Вы проверили пакет shinytree?
3. Используйте комбинацию
oberserveEvent
иupdateCheckboxGroupInput
Ответ №1:
Как предложил @warmoverflow, используйте observeEvent
и updateCheckboxGroupInput
. Вы должны понять суть этого из примера.
Код:
library(shiny)
l2_choices <- list("L2_1" = "Level 2-1",
"L2_2" = "Level 2-2",
"L2_3" = "Level 2-3")
l3_choices <- list("L3_1" = "Level 3-1",
"L3_2" = "Level 3-2",
"L3_3" = "Level 3-3",
"L3_4" = "Level 3-4",
"L3_5" = "Level 3-5",
"L3_6" = "Level 3-6",
"L3_7" = "Level 3-7",
"L3_8" = "Level 3-8",
"L3_9" = "Level 3-9")
lvl3_f3 <- l3_choices[1:3]
lvl2_f1 <- l2_choices[1]
ui <- shinyUI(navbarPage("RP 2014",
tabPanel("Sélection",
print (h4(strong("Geographical levels"))),
fluidRow(
column(width = 3,
h5(strong("Level 1")),
checkboxInput("dynamic_L1",
label = "")
), # f. column
column(width = 3,
checkboxGroupInput("dynamic_L2",
label = h5(strong("Level 2")),
choices = l2_choices)
),
column(width = 3,
checkboxGroupInput("dynamic_L3",
label = h5(strong("Level 3")),
choices = l3_choices)
)
)
)
)
)
server <- function(input, output, session){
observeEvent(input$dynamic_L1, {
# Get all the checkboxes checked when the Level 1 checkbox is checked
if(input$dynamic_L1){
updateCheckboxGroupInput(session, inputId = "dynamic_L2", selected = l2_choices)
updateCheckboxGroupInput(session, inputId = "dynamic_L3", selected = l3_choices)
}
observeEvent(input$dynamic_L3, {
# Get the first level of Level 2 checked automatically when the 3 first levels of Level 3 are checked
if (all(lvl3_f3 %in% input$dynamic_L3)) {
updateCheckboxGroupInput(session, inputId = "dynamic_L2", selected = c(input$dynamic_L2, lvl2_f1))
}
})
})
}
shinyApp(ui, server)
Комментарии:
1. Спасибо всем за ваши предложения: @rosscova, спасибо за ваше предложение, я думаю, это хорошая идея. @ Valter, вам тоже спасибо, ваша идея очень интересна, но. К сожалению, аспект shinyTree не соответствует этой части приложения. Я буду использовать его в другой части моей программы. @ warmoverflow и GyD, большое вам спасибо, мне нравится ваше предложение, но, поскольку я новичок в R, мне сейчас немного сложно настроить checked / unchecked при определенных условиях. Итак, наконец, я буду использовать conditionalPanel, который проще, поскольку у меня есть много других флажков для добавления. Еще раз большое вам спасибо.