2017-08-16 1 views
0

Ich versuche, ein navlistPanel mit mehreren Registerkarten und für jede dieser Registerkarten ein TabsetPanel mit wieder mehreren Registerkarten anzuzeigen. Das gelingt mir mit der Funktion do.call und zwei lapply, um im navlistPanel und tabsetPanel die benötigte Anzahl an Tabs anzuzeigen. Ich kann jedoch keine Tabelle mehr anzeigen, wenn eine CSV-Datei hochgeladen wird.Shiny do.call, lapply und modules

Weiß jemand, was ich hier falsch mache? Hier ist mein Code:

library(shiny) 
library(shinydashboard) 

moduleUI <- function(id){ 
    ns <- NS(id) 
    tagList(
    sidebarLayout(
    sidebarPanel(
     fileInput(ns("file"), label = "", multiple = TRUE, 
       accept=c('text/csv', 
         'text/comma-separated-values,text/plain', 
         '.csv')) 
    ), 

    mainPanel(div(dataTableOutput(ns('table')), style = "font-size: 70% ;width: 70")) 
))} 

module <- function(input, output, session){ 

    output$table <- renderDataTable({ 
    inFile <- input$file 
    if (is.null(inFile)) 
     return(NULL) 
    read.csv(inFile$datapath) 
    }) 
} 

moduleUI2 <- function(id){ 
    ns <- NS(id) 
    tagList(

    do.call(navlistPanel, args = c(id = "tabs", lapply(1:4, function(i) { 
     tabPanel(title = paste("tab", i), style = 'overflow-x: scroll', 
       mainPanel(
       do.call(tabsetPanel, c(id = paste0("versions",i), lapply(1:5, function(n){ 
        tabPanel(title = paste("version", n), 
          moduleUI(paste("base",i, n, sep = "_")), 
          h4(paste("tab", n)) 
        ) 
       }))), 
       width = 12) 
    ) 
    }))) 
    )} 

module2 <- function(input, output, session){ 

    lapply(1:4,function(i) { 
    lapply(1:5, function(n) { 
     callModule(module, paste("base",i,n, sep = "_")) 
    }) 
    }) 
} 

ui <- dashboardPage(
    dashboardHeader(title = "App"), 
    dashboardSidebar(
    sidebarMenu(id = "tabs", 
       menuItem("Tab1", tabName = "Tab1") 
    ) 
), 

    dashboardBody(
    tabItems(
     tabItem(tabName = "Tab1", 
       moduleUI2("base") 
    )) 
)) 

server <- function(input, output, session){ 

    callModule(module2, "base") 
} 

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

Sieht aus wie Sie ids wiederholen auf/in 'tabsetPanel'. Versuchen Sie etwas wie 'do.call (tabsetPanel, c (id = einfügen (" versions ", i), ...' und 'moduleUI (einfügen (" basis ", i, n, sep =" _ "))'. – user5029763

+0

Vielen Dank für Ihre Hilfe, Ihre Lösung hat funktioniert, aber ich habe jetzt ein paar Änderungen an meiner App vorgenommen (Siehe bearbeiteter Code), ein weiteres Modul hinzugefügt. Und noch einmal wird die dataTable nicht angezeigt. Können Sie sehen, was ist falsch diesmal – MaxPlank

+0

Ich habe Ihre Bearbeitung noch nicht gelesen, aber ich dachte, dass Sie das interessieren könnte: https://github.com/jcheng5/shiny-partials – user5029763

Antwort

0

ich den Fehler gefunden haben, fügen Sie einfach eine ns() an die folgende Zeile und die Daten werden korrekt angezeigt:

ns(paste("base",i, n, sep = "_"))