我有一个分配给不同人员的订单数据框:
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
时,将创建一个新行。我希望输出看起来像这样:
答案 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进行进一步的讨论