DT 不提供内置的总和标题行。 解决方案需要满足以下要求:
我尝试了多种方法来完成上述任务,但我陷入了下面的代码示例。 你能指出我正确的方向吗?
library(DT)
library(shiny)
# Create sample data
data <- data.frame(matrix(rnorm(45*5), ncol=5))
colnames(data) <- c("A", "B", "C", "D", "E")
# Calculate column sums
colSums <- colSums(data)
print('ColUms')
print(colSums)
print(data)
# Create Shiny app
ui <- fluidPage(
DT::dataTableOutput("table")
)
server <- function(input, output) {
output$table <- DT::renderDataTable({
# print(data)
datatable(data, editable = TRUE, rownames = FALSE, options = list(pageLength = 10),
# Add column names and sums to table header
container = htmltools::withTags(table(
class = 'display',
thead(
tr(
lapply(colnames(data), th)
),
tr(
lapply(colSums, function(x) th(x))
)
)
)))
})
# Update column sums if table is edited
observeEvent(input$table_cell_edit, {
cell <- input$table_cell_edit
data[cell$row, cell$col] <<- cell$value
colSums <<- colSums(data)
})
}
shinyApp(ui, server)
在他们将此作为一项新功能实现之前,这是一种可能性。
通过将
data
设置为反应值,当事件观察者更新它时,将触发 renderDataTable
重新渲染并更新值。
library(DT)
library(shiny)
# Create sample data
data <- data.frame(matrix(rnorm(45*5), ncol=5))
colnames(data) <- c("A", "B", "C", "D", "E")
# Create Shiny app
ui <- fluidPage(
DT::dataTableOutput("table")
)
server <- function(input, output) {
data <- reactiveVal(data)
output$table <- DT::renderDataTable({
totals <- unname(colSums(data()))
nm <- colnames(data())
datatable(data(), editable = TRUE, rownames = FALSE, options = list(pageLength = 10),
# Add column names and sums to table header
container = htmltools::withTags(table(
class = "display",
thead(
tr(
lapply(nm, th)
),
tr(
lapply(totals, th)
)
)
))
)
})
# Update column sums if table is edited
observeEvent(input$table_cell_edit, {
data(editData(data(), input$table_cell_edit, rownames = FALSE))
})
}
shinyApp(ui, server)