2016-10-09 5 views
0

Ich habe 3 verschiedene geographische Ebenen in meinem ui.R: die globale Ebene (Ebene 1), die 3 Unterebenen (Ebene 2) enthält, wobei jede Ebene 3 Unterebenen (Ebene 3) enthält.Hierarchie von checkboxGroupInput

Die 3 ersten Ebenen der Ebene 3 sind in der ersten Ebene der Ebene 2 enthalten, die nächsten 3 Ebenen der Ebene 3 sind in der zweiten Ebene der Ebene 2 enthalten, die letzten 3 Ebenen der Ebene 3 sind in der dritte Ebene der Ebene 2.

Wie kann ich alle Kontrollkästchen aktivieren, wenn das Kontrollkästchen Ebene 1 aktiviert ist? Und wenn ich die 3 ersten Level von Level 3 überprüfe, wie bekomme ich automatisch die erste Ebene von Level 2? Hier

ist der UI-Code:

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")) 
          ) 
          ) 
        ) 
       )  
) 

Ich hoffe, meine Frage ist verständlich, danke für mich zu helfen.

+0

Ich habe keine vollständige Antwort, aber ich würde, indem er einen Blick starten 'reactive' Funktion wird unter den gegebenen Umständen genannt Sie beschreiben, mit einem' updateCheckboxGroupInput bei Verwendung 'Funktion zum Ändern der ausgewählten Eingänge. – rosscova

+0

Haben Sie das Paket [shinytree] (https://cran.r-project.org/web/packages/shinyTree/README.html) überprüft? –

+0

Verwenden Sie eine Kombination aus "oberserveEvent" und "updateCheckboxGroupInput" –

Antwort

1

Als @warmoverflow vorgeschlagen, verwenden Sie observeEvent und updateCheckboxGroupInput. Sie sollten das Wesentliche davon aus dem Beispiel bekommen.

Code:

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) 
+0

Vielen Dank für Ihre Anregungen: @rosscova, vielen Dank für Ihren Vorschlag, ich denke, es ist eine gute Idee. @ Valter, danke dir auch, deine Idee ist aber sehr interessant. Leider passt der Aspekt von shinyTree nicht zu diesem Teil der Anwendung. Ich werde es in einem anderen Teil meines Programms verwenden. @ warmoverflow und GyD, vielen Dank, ich mag deinen Vorschlag, aber da ich neu bei R bin, ist es ein bisschen schwierig für mich, jetzt unter Bedingungen aktiviert/deaktiviert zu setzen. So, schließlich werde ich conditionalPanel verwenden, das einfacher ist, da ich viele andere Kontrolle-Kästen hinzufügen muss. Danke dir nochmal. –

Verwandte Themen