2013-10-19 4 views
33

Ich entwickle eine glänzende Anwendung, in der ich tabsetPanel benutze, die generiert wird, wenn der Benutzer einen bestimmten Eingang eingibt. Daher möchte ich renderUI Funktion verwenden, um ein TabsetPanel erscheinen/verschwinden zu lassen.R Shiny - tabPanel dynamisch zu tabsetPanel hinzufügen (mit der Verwendung von renderUI)

jetzt Mein Kampf ist, dass Anzahl vontabPanel Elemente (Argumente von tabsetPanel) hängt auch von Benutzereingaben, in der Art und Weise: manchmal brauche ich 1 ein, ein anderes Mal will ich mehr tabPanels.

Wie man es macht? Ich habe versucht, einschließlich conditionPanel oder einschließlich einfache if()... Bedingung in der tabsetPanel Argument, aber es (eher nicht überraschend ...) hat nicht funktioniert.

Antwort

57

Hier gehen Sie. Der Code ist ziemlich selbsterklärend.

library(shiny) 
runApp(list(
    ui = pageWithSidebar(
    headerPanel('Dynamic Tabs'), 
    sidebarPanel(
     numericInput("nTabs", 'No. of Tabs', 5) 
    ), 
    mainPanel(
     uiOutput('mytabs') 
    ) 
), 
    server = function(input, output, session){ 
    output$mytabs = renderUI({ 
     nTabs = input$nTabs 
     myTabs = lapply(paste('Tab', 1: nTabs), tabPanel) 
     do.call(tabsetPanel, myTabs) 
    }) 
    } 
)) 
+0

** Ramnath **, das machte meinen Tag, es funktioniert super! Vielen Dank!! –

+0

Ich bin froh, Ihnen helfen zu können. Wenn Sie Fragen zum Code selbst haben, schreiben Sie hier. – Ramnath

+0

Add-on: Sobald Sie die hinzugefügten Registerkarten haben, was ist der richtige Weg, um den gleichen 'uiOutput' zu allen Registerkarten hinzuzufügen, aber die Werte innerhalb jeder Registerkarte eindeutig zu machen? Oder ist das anders? Wenn Sie eine 'output $ base_tab_ui' hinzufügen und sie in jedem rendern, haben alle denselben 'input $ value' für jede Registerkarte. Gibt es eine Möglichkeit, diese mit unterschiedlichen Namen von Eingabevariablen eindeutig zu machen? – Jenks

2

Es gibt einen Weg, um dynamisch tabPanels hinzufügen ohne renderUI, die nicht so offensichtlich wie die Version mit renderUI sein könnten. Ich schrieb eine Funktion addTabToTabset, die eine beliebige (Liste von) TabPanel (s) an ein Tabset/navbar anhängen wird.

Dieser Ansatz hat eine Reihe von Vorteilen über mit renderUI:

  • Bestehende tabPanels werden nicht jedes Mal ein neues Panel hinzugefügt wird neu gemacht. (schneller)
  • So nicht alle Eingabevariablen in vorhandenen Panels zurückgesetzt werden. (keine Variablen speichern Workarounds benötigt)
  • Struktur des Panels Inhalte können individuell ausgewählt werden. (In der lapply - renderUI Version, alle Platten haben etwas gleichförmig sein.)

Die Lösung und Codebeispiel kann in der Antwort here finden. Auf Wunsch könnte ich den Code hier auch posten.