【问题标题】:R Shiny datatable group rows for legibilityR Shiny 数据表组行以提高可读性
【发布时间】:2019-12-24 15:10:48
【问题描述】:

我有一个分配给不同人的订单数据框:

x<-data.frame(id = c("AAA", "AAA", "AAA", "BBB", "BBB", "CCC"), 
              name = c("Alice", "Alice", "Alice", "Bob", "Bob", "Charlie"),
              prod = c("T-Shirt", "Pants", "Socks", "Socks", "Pants", "T-Shirt"))

我想在 Shiny 应用程序中显示。这是一个 MRE:

library(shiny)
library(tidyverse)

runApp(list(

  ui = basicPage(
    dataTableOutput('mytable')
  ),

  server = function(input, output) {
    output$mytable = renderDataTable({
      x
    })
  }
))

虽然这个示例在给定数据框的情况下完全按照预期显示数据,但我想知道是否可以更改数据向最终用户显示的方式(以提高可读性)。

我希望按id 对表格进行分组,以便每个id 的第一行包含在prod 列中回车之前的所有信息(跨行)。当到达下一个唯一的id 时,将创建一个新行。我希望输出看起来像这样:

https://ibb.co/KhvgnbK

【问题讨论】:

    标签: r shiny


    【解决方案1】:

    不是最优雅的,但在这里:

    library(shiny)
    library(tidyverse)
    
    runApp(list(
    
        ui = basicPage(
            dataTableOutput('mytable')
        ),
    
        server = function(input, output) {
            output$mytable = renderDataTable({
                for(i in nrow(x):2){
                    if(x$id[i] == x$id[i-1])
                        x$id[i] <- ''
                    if(x$name[i] == x$name[i-1])
                        x$name[i] <- ''
                }
                x
            })
        }
    ))
    

    更新 您也可以使用DT package,然后使用类参数here

    library(shiny)
    library(tidyverse)
    library(DT)
    
    runApp(list(
    
        ui = basicPage(
            dataTableOutput('mytable')
        ),
    
        server = function(input, output) {
            output$mytable = renderDataTable({
                for(i in nrow(x):2){
                    if(x$id[i] == x$id[i-1])
                        x$id[i] <- ''
                    if(x$name[i] == x$name[i-1])
                        x$name[i] <- ''
                }
                datatable(x, rownames = FALSE, class = "compact") # or use "hover"
            })
        }
    ))
    

    【讨论】:

    • 您提供的DT 解决方案看起来不错,谢谢!你知道是否可以对行进行“条纹”处理,使AAA 为灰色,BBB 为白色,CCC 恢复为白色?
    • 不幸的是,上面是一个 hacky 解决方案,我在显示表格之前删除了重复值。我假设有更好的方法来做到这一点。
    【解决方案2】:

    这个怎么样:

    library(shiny)
    library(tidyverse)
    library(knitr)
    library(kableExtra)
    
    runApp(list(
    
        ui = basicPage(
            tableOutput('mytable')
        ),
    
        server = function(input, output) {
    
            x <- data.frame(id = c("AAA", "AAA", "AAA", "BBB", "BBB", "CCC"), 
                          name = c("Alice", "Alice", "Alice", "Bob", "Bob", "Charlie"),
                          prod = c("T-Shirt", "Pants", "Socks", "Socks", "Pants", "T-Shirt"))
    
            output$mytable <- function() {
                x %>% 
                kable(align = "c", "html") %>%
                    kable_styling(bootstrap_options = "striped", full_width = F, position = "left",font_size = 12)%>%
                    column_spec(1, bold = T) %>%
                    collapse_rows(columns = c(1,2), valign = "middle")
            }
        }
    ))
    

    或者,如果您对一点 javascript 感到满意并且更喜欢 data.table,您可以使用 datatables-rowsgroup.js,这将进一步讨论 here

    【讨论】:

    • 这看起来不错,谢谢!最后一个(快速)问题:有没有办法阻止prod 列被交替条带化?
    • 您可以通过设置bootstrap_options = "basic" 来阻止所有列被条带化。我不知道有一种方法可以按特定列索引条带
    猜你喜欢
    • 2021-10-01
    • 2013-07-17
    • 2019-12-19
    • 1970-01-01
    • 1970-01-01
    • 2018-06-02
    • 1970-01-01
    • 1970-01-01
    • 2019-07-12
    相关资源
    最近更新 更多