R Lucido – aggiungere tabPanel per tabsetPanel dinamicamente (con l’uso di renderUI)

Sto sviluppando una brillante applicazione in cui uso tabsetPanel, che viene generato quando l’utente entra in un ingresso particolare. Quindi, voglio usare renderUI funzione per creare una tabsetPanel apparire /scomparire.

La mia lotta ora è che numero di tabPanel elementi (argomenti di tabsetPanel) dipende anche da input dell’utente, nel senso: a volte ho bisogno di 1 uno, altre volte voglio di più tabPanels.

Come fare? Ho cercato tra conditionPanel o semplici if()... condizione in tabsetPanel argomento, ma (piuttosto non a caso…) non ha funzionato.

 

2 Replies
  1. 67

    Qui si va. Il codice è piuttosto auto esplicativo.

    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)
        })
      }
    ))
    • Ramnath, questo ha reso la mia giornata, funziona alla grande! La ringrazio molto!!
    • Felice di essere di aiuto. Se avete domande per il codice stesso, a postare qui.
    • Add on: una Volta che hai aggiunto schede, qual è il modo corretto di aggiungere lo stesso uiOutput a tutte le schede, ma rendere i valori univoci all’interno di ogni scheda? O è diverso? Se si aggiunge un output$base_tab_ui e li rende in ogni, tutti di tenere la stessa input$value per ogni scheda. C’è un modo per rendere unici questi con input diversi nomi di variabile?
    • come si va sulla compilazione di ciascuna di queste dinamiche schede con il suo contenuto? forse, diciamo, un renderTable / tableOutput di dati.frame che possono essere filtrati utilizzando lo stesso oggetto che ho usato per compilare la scheda di nomi (ie nTabs = length(lags_7) e myTabs = lapply(sprintf('%s', lags_7), tabPanel)) (eventuale risposta qui: stackoverflow.com/questions/39276104/…)
  2. 3

    C’è un modo per aggiungere dinamicamente tabPanels senza renderUI, che potrebbe non essere così evidente come la versione con renderUI. Ho scritto una funzione addTabToTabset che aggiungerà qualsiasi (elenco) tabPanel(s) per un tabset/navbar.

    Questo approccio ha una serie di vantaggi con l’utilizzo di renderUI:

    • Esistenti tabPanels non sono ri-renderizzati, ogni volta che un nuovo pannello è aggiunto. (più veloce)
    • Così, non resettando tutte le variabili di input all’interno di Pannelli esistenti. (non variabile memorizzazione di soluzioni alternative necessarie)
    • Struttura del contenuto del pannello possono essere scelti singolarmente. (In lapply – renderUI versione, tutti i pannelli devono essere piuttosto uniforme.)

    La soluzione e il codice di esempio può essere trovato nel rispondere qui. Se richiesto, potrei anche postare il codice qui.

Lascia un commento