2013-04-25 6 views
22

Chciałbym wyświetlić różne dane wejściowe dla różnych kart. Więc próbowałem zbudować stronę z kilkoma tabPanelami. Jednak nie mogę mieć czegoś jak poniżej:Czy zakładki z własnymi paskami bocznymi i panelami głównymi są dostępne w kolorze błyszczącym?

library(shiny) 

shinyUI(pageWithSidebar(
    headerPanel("Header"), 

    tabsetPanel(
    tabPanel(
     headerPanel("Tab 1"), 
     sidebarPanel(
     selectInput("var", "Parametre", choices = c("1", "2", "3")) 
     ), 
     mainPanel(
     textOutput("text1") 
     ) 
    ), 
    tabPanel(
     headerPanel("Tab 2"), 
     sidebarPanel(
     selectInput("var", "Parametre", choices = c("21", "22", "23")) 
    ), 
     mainPanel(
     textOutput("text2") 
    ) 
    ) 
    ) 
)) 

Podejrzewam, że pageWithSidebar jest przyczyną problemu, ale nie mogłem znaleźć alternatywę w grupach google. Czy istnieje sposób wyświetlania kilku kart z ich własnymi pasami bocznymi i mainPanels, czy też powinienem tworzyć różne aplikacje do tego celu?

+0

Proszę dodać swoją ramkę danych do pytania. – Abbas

+0

@barerd Utwórz przykładową ramkę graficzną dla zabawki, która ilustruje Twój problem. na przykład coś * simillar * do 'data.frame (ID = seq (10), Yas = runif (10), Hosp = rep (c (" A "," B "), 5))' –

Odpowiedz

23

Jeśli źle zrozumiałem twoje pytanie, myślę, że możesz nawet uniknąć części jQuery (z @ f1r3br4nd odpowiedzi), podając identyfikator dla funkcji tabsetPanel, tutaj id = "conditionedPanels". Parametr value (tj. Która zakładka jest wybrana w panelu głównym) jest następnie dostępny za pośrednictwem zmiennej input.

Przykład z minikondem:: server.R może być pusty, z wyjątkiem szkieletu funkcji shinyServer. Plik ui.R może wyglądać następująco.

shinyUI(pageWithSidebar(
    headerPanel("Conditional Panels"), 
    sidebarPanel(
    conditionalPanel(condition="input.conditionedPanels==1", 
        helpText("Content Panel 1") 
    ), 
    conditionalPanel(condition="input.conditionedPanels==2", 
        helpText("Content Panel 2") 
    ) 
), 
    mainPanel(
    tabsetPanel(
     tabPanel("Panel 1", value=1), 
     tabPanel("Panel 2", value=2) 
     , id = "conditionedPanels" 
    ) 
) 
)) 
+0

Więcej na ten temat znajdziesz tutaj: https://groups.google.com/forum/#!topic/shiny-discuss/07EU9xG11l0 –

+0

Proszę wyjaśnić, co mają reprezentować '1' i' 2'? W praktyce moje komendy 'tabPanel()' zwykle mają coś takiego jak 'tabPanel (" Panel 2 ", uiOutput (" blah "))), więc może mógłbyś poszerzyć swoją odpowiedź, aby uwzględnić obsługę typowych sytuacji takich jak ta? – warship

+0

@warship Jest to "wartość", którą wybrałeś w "tabPanel" –

10

mam kopalni pracować mając tylko jeden sidebarPanel jak w błyszczące przykładowych aplikacji, ale następnie owijając rzeczy w sidebarPanel to tylko dla konkretnych kart w oddzielnych conditionalPanel połączeń jak here. Sztuczka polega na tym, aby ciąg znaków, który jest argumentem warunku conditionalPanel, był instrukcją jQuery, która analizuje atrybut html aktualnie wybranej karty i === s to nazwa karty, dla której ta zawartość powinna pojawić się na pasku bocznym :

conditionalPanel(
    "$('li.active a').first().html()==='Foo'", 
    actionButton("bar","Bar")); 

... gdzie Foo to tytuł zakładki.

Krótko mówiąc, jeden pasek boczny, ale jego treść zależy od aktywnej karty.

+2

Dziękuję za to i trochę inne odpowiedzi na temat R, które przeczytałem za pośrednictwem twojego profilu. – barerd

+0

Chociaż podoba mi się to rozwiązanie, myślę, że obsługiwane rozwiązanie to @mark-heckmann. Zobacz jego rozwiązanie w tym wątku i jego link do grup google w komentarzu. Poleciłbym OP, aby zaakceptował swoją odpowiedź jako rozwiązanie. – ctbrown

Powiązane problemy