R闪亮的数据表组行以提高可读性

时间:2019-08-19 11:42:52

标签: r shiny

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

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

2 个答案:

答案 0 :(得分:0)

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

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"
        })
    }
))

答案 1 :(得分:0)

如何?

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")
        }
    }
))

或者,如果您对使用Java脚本感到满意,并且更喜欢data.table,则可以使用datatables-rowsgroup.js,我们将在here进行进一步的讨论