2017-11-28 8 views
0

Ich baue eine Shiny App mit ShinyBS und Shinyjs Paketen, und ich möchte bscollapse Panels verstecken/anzeigen, abhängig von der Eingabe eines Radio Buttons in einem anderen bscollapse Panel.Zeige/Verstecke bsCollapse Panels in Shiny

Wenn "AAA" oder "BBB" -Option in Parent1 ausgewählt ist, möchte ich nur "AAAA" und "BBBB" collapsePanels in Parent2 anzeigen.

Wenn "CCC" oder "DDD" -Option in Parent1 ausgewählt ist, möchte ich nur "CCCC" und "DDDD" collapsePanels in Parent2 anzeigen.

Ich verwende show() und hide() Befehle aus dem Paket shinyjs, aber ich kann es nicht funktionieren. Wenn "AAA" oder "BBB" ausgewählt ist, wird in Parent2 nichts angezeigt, was ich nicht möchte.

Unten ist der Code, um das Problem zu reproduzieren:

library(shiny) 
library(shinyBS) 
library(shinyjs) 

server = function(input, output, session) { 

observeEvent(input$TypeRadio,{ 
if (input$TypeRadio == "AAA" || input$TypeRadio == "BBB") 
    shinyjs::show("collapse1") 
    shinyjs::hide("collapse2") 
}) 

observeEvent(input$TypeRadio,{ 
if (input$TypeRadio == "CCC" || input$TypeRadio == "DDD") 
    shinyjs::show("collapse2") 
    shinyjs::hide("collapse1")}) 
} 


ui = fluidPage(
shinyjs::useShinyjs(), 

bsCollapse(id = "collapseExample", multiple = FALSE, 
bsCollapsePanel("Parent1","", 

       radioButtons("TypeRadio", "", 
          choices = list("AAA" = "AAA", 
              "BBB" = "BBB", 
              "CCC" = "CCC", 
              "DDD" = "DDD"), 
          inline = FALSE)), 


bsCollapsePanel("Parent2","", 

       bsCollapse(id = "collapse1", 
         bsCollapsePanel("AAAA", ""), 
         bsCollapsePanel("BBBB", "")), 

       bsCollapse(id = "collapse2", 
         bsCollapsePanel("CCCC", ""), 
         bsCollapsePanel("DDDD", "")) 

         ) 
)     
) 
shinyApp(ui = ui, server = server) 
+0

Ok, ich kann es nur bekam statt Show mit conditionalPanel arbeiten() und hide(). Aber ich bin ziemlich neugierig zu wissen, warum es überhaupt nicht mit show/hide() funktioniert. Jede Eingabe wäre dankbar, danke! – ZedzDeD

+0

Ich denke, es ist die Art, wie 'ifelse()' funktioniert. Die Zuweisung der linken Seite wird überprüft, wenn Sie einen Wert mit einer Eingabe validieren. Bitte sehen Sie meine Antwort unten, ich habe kleine Änderungen an Ihrem Code vorgenommen, um wie gewünscht zu arbeiten. – Sagar

Antwort

0
library(shiny) 
library(shinyBS) 
library(shinyjs) 

if(interactive()){ 
    shinyApp(
    ui <- fluidPage(
     useShinyjs(), 
     bsCollapse(id = "collapseExample", multiple = FALSE, 
       bsCollapsePanel("Parent1","", 
           radioButtons("TypeRadio", "", 
               choices = list("AAA" = "AAA", 
                  "BBB" = "BBB", 
                  "CCC" = "CCC", 
                  "DDD" = "DDD"), 
               inline = FALSE)), 
       bsCollapsePanel("Parent2","", 
           bsCollapse(id = "collapse1", 
              bsCollapsePanel("AAAA", ""), 
              bsCollapsePanel("BBBB", "")), 

           bsCollapse(id = "collapse2", 
              bsCollapsePanel("CCCC", ""), 
              bsCollapsePanel("DDDD", "")) 
           ) 
    ) 
    ), 

    server = function(input, output, session){ 

     observeEvent(input$TypeRadio,{ 
     if("AAA" == input$TypeRadio | "BBB" == input$TypeRadio){ 
      shinyjs::show("collapse1") 
      shinyjs::hide("collapse2") 
     } 

     if("CCC" == input$TypeRadio | "DDD" == input$TypeRadio){ 
      shinyjs::hide("collapse1") 
      shinyjs::show("collapse2") 
     } 
     }) 

    } 
) 
} 
+0

Danke !! Einfach so einfach :) – ZedzDeD