首页 > 解决方案 > 如何一次显示表的反应数量(具有不同的结果)?闪亮的应用程序

问题描述

根据我的选择,我在显示表的反应数量时遇到问题。我想做的是在一列中呈现与唯一记录一样多的表,并一一显示它们以及每个子组的结果。

如果我分享这个例子会更容易:


  dashboardHeader(title = "My App"),

  dashboardSidebar(id="", sidebarMenu(

    menuItem(strong("Tab1"), tabName = "T1", icon = icon("table")))),

  dashboardBody(

    tabItems(

      tabItem(
        tabName="T1",
              fluidRow(tableOutput('tables'))
        )
      )
    )
  )



server <- function(input, output) {

  observeEvent(length(unique(mtcars$gear)), {
    lapply(1:length(unique(mtcars$gear)), 
           function(i){
             output[[paste0('table', i)]]<-renderTable({

               filtered<-mtcars

               a<-list()

               for (j in unique(filtered$gear)){

                 subd <- filtered[filtered$gear == j,] 

                 a[[j]]<-subd

                 }

               for(i in 1:length(a)){
                 a[[i]]
               }

              a[[3]]

             })
           })
  })

  output$tables <- renderUI({
    lapply(1:length(unique(mtcars$gear)), 
           function(i) {
             uiOutput(paste0('table', i))
           })
  })


}

shinyApp(ui = ui, server = server)

我想从这段代码中得到的是 3 个表(一个带有齿轮 = 3 的汇总表,一个齿轮 = 4 和一个齿轮 = 5)。我现在得到的是 3 个表,结果为 gear=3。

我试图编写一个遍历列表的 for 循环,但我不知道应该在哪里添加这个 for 循环以使其正常工作。

谢谢!

标签: rshiny

解决方案


您可以使用split根据数据框中某个因子的级别来制作表格列表。从那里,您的轻微修改renderUI应该会得到您想要的结果。另请注意,我将tables输出更改为,uiOutput而不是tableOutput因为您使用renderUI.

library(shiny)
library(shinydashboard)

ui <- dashboardPage(
  dashboardHeader(title = "My App"),

  dashboardSidebar(id = "", sidebarMenu(
    menuItem(strong("Tab1"), tabName = "T1", icon = icon("table"))
  )),

  dashboardBody(tabItems(tabItem(
    tabName = "T1",
    fluidRow(uiOutput('tables'))
  )))
)

server <- function(input, output) {

  tables_in_list <- split(x = mtcars, f = mtcars$gear)

  output$tables <- renderUI({
    lapply(seq_along(tables_in_list), function(i)
      renderTable(tables_in_list[[i]]))
  })
  }

shinyApp(ui = ui, server = server)

推荐阅读