代码之家  ›  专栏  ›  技术社区  ›  SNT

在R中动态创建表时出错

  •  1
  • SNT  · 技术社区  · 7 年前

    我有一个数据框,我想在这个例子中根据年份过滤和创建表。我已经4年了。所以我想创建4个新表,并分别显示在闪亮的应用程序。我确实得到了循环的一部分,并通过过滤器变量,但如何才能创建4个新表,并显示在用户界面上。我可以得到动态标签面板,但库(闪亮)

    library(shinyWidgets)
    library(shinydashboard)
    library(DT)
    
    sidebar <- dashboardSidebar(
      sidebarMenu(id = "tab",
                  menuItem("1", tabName = "1")
      )
    )
    body <-   ## Body content
      dashboardBody(box(
        uiOutput('mytabs')
        ))
    
    ui <-   dashboardPage(dashboardHeader(title = "Scorecard"),
                          sidebar,
                          body)
    
    # Define the server code
    server <- function(input, output,session) {
      df <- data.frame(structure(list(`Mazda` = c(21000,20000,21500,24000), `Honda` = c(21500,20500,22000,24500)
                                      ,  Sales = c(2017,2015,2016,2014)
                                      )
                                 , class = "data.frame", row.names = c(NA, -4L)))
      toAdd <- as.vector(df$Sales)
    
      for(i in length(toAdd)){
        print(length(toAdd))
      output[[paste0("datatable_",i)]] <- DT::renderDataTable({
       df %>% filter(Sales == toAdd[i])
      })
    #}
     # for(i in 1:length(toAdd)){
    
      output$mytabs <- renderUI({
        nTabs = length(toAdd)
        # create tabPanel with datatable in it
        myTabs = lapply(seq_len(nTabs), function(i) {
          tabPanel(paste0("dataset_",toAdd[i]),
                   DT::dataTableOutput(paste0("datatable_",i))
          )
        })
    
        do.call(tabsetPanel, myTabs)
    
      })
    }
    }
    
    shinyApp(ui = ui, server = server)
    
    1 回复  |  直到 7 年前
        1
  •  2
  •   Stéphane Laurent    7 年前

    你必须使用 local ,不要 renderUI

      for(i in 1:length(toAdd)){
        local({
          ii <- i
          output[[paste0("datatable_",ii)]] <- DT::renderDataTable({
            df %>% filter(Sales == toAdd[ii])
          })
        })
      }
    
      output$mytabs <- renderUI({
        nTabs = length(toAdd)
        # create tabPanel with datatable in it
        myTabs = lapply(seq_len(nTabs), function(i) {
          tabPanel(paste0("dataset_",toAdd[i]),
                   DT::dataTableOutput(paste0("datatable_",i))
          )
        })
        do.call(tabsetPanel, myTabs)
      })
    
    推荐文章