【问题标题】:Display each group of a data.frame in a separate table in shiny dashboard在闪亮仪表板的单独表格中显示每组 data.frame
【发布时间】:2020-09-06 16:33:27
【问题描述】:

我正在尝试根据分组变量拆分数据框,然后在闪亮的仪表板应用程序中将每个组显示为单独框中的表格。 但是,我在所有表格中一直得到相同的组。每个框的标题都显示正确,如果我介绍一些打印语句,我还可以看到似乎处理了正确的数据。 以下是重现问题的示例:

library(tidyverse)
library(shiny)
library(shinydashboard)

ui <- dashboardPage(
    dashboardHeader(),
    dashboardSidebar(),
    dashboardBody(uiOutput("tables"))
)

server <- function(input, output) {
    output$tables <- renderUI({
        df <- iris %>%
            group_by(Species) %>%
            group_split()
        
        ui <- tagList()
        for(df.split in df) {
            id <- paste0("tbl_", df.split[1, "Species"])
            output[[id]] <- renderTable(head(df.split, 3))
            ui <- append(
                ui,
                box(
                    title = df.split[1, "Species"],
                    tableOutput(id)
                )
            )
        } 
        return(ui)
    })
    
}

shinyApp(ui = ui, server = server)

【问题讨论】:

    标签: r shiny shinydashboard


    【解决方案1】:

    这是一个有趣的案例。我认为这应该可行,如果不是,请告诉我:

    library(tidyverse)
    library(shiny)
    library(shinydashboard)
    
    multiple_dt <- function(output,id,table_list){
      ns <- NS(id)
      ui <- tagList(lapply(table_list,function(df.split){
        box(
          title = as.character(df.split[1, "Species"]),
          tableOutput(ns(as.character(df.split[1,"Species"]))),
          output[[ns(df.split[1,"Species"])]] <- renderTable(head(df.split, 3))
        )
      }))
      ui
    }
    
    ui <- dashboardPage(
      dashboardHeader(),
      dashboardSidebar(),
      dashboardBody(uiOutput("tables"))
    )
    
    server <- function(input, output) {
      output$tables <- renderUI({
        df <- iris %>%
          group_by(Species) %>%
          group_split()
        
        multiple_dt(output,"tables",df) 
      })
    }
    shinyApp(ui = ui, server = server)
    

    我认为您的代码中有多个错误。首先,我认为您的附加无法正常工作,因为要呈现的表没有很好地存储在列表中(它们只是连续存储,而应该有一个层次维度,这是在函数multiple_dt 中创建的lapply)。 此外,当您创建像这样的复杂闪亮对象时,您应该创建一个新函数来渲染它,就像我对具有 NS id 等的结构化代码所做的那样。

    【讨论】:

    • 有趣的方法!你会说为函数使用单独的命名空间有什么好处?我只知道在创建模块时使用命名空间(我认为这也是一种适用于此处的替代方法)。
    • 我想说在这里使用 ns 是一种标准化 id 标签的方法:使用它,您不能创建不连贯的 id,因此很容易检索它们。我同意模块方法在这里也适用。我认为这个解决方案只是一个“手工”模块。
    • 像魅力一样工作,谢谢!补充一条评论。使用 df.split[1, "Species"] 返回一个 1x1 tibble,ns() 函数似乎并不介意,但没有它,您必须先将其转换为单个值。
    • 哦,“multiple_dt
    猜你喜欢
    • 2019-08-19
    • 2015-04-22
    • 2018-05-18
    • 2019-05-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-02-12
    • 1970-01-01
    相关资源
    最近更新 更多