DT 在标题行中显示每列的总和

问题描述 投票:0回答:1

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)
r shiny datatables dt
1个回答
0
投票

在他们将此作为一项新功能实现之前,这是一种可能性。

通过将

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)

© www.soinside.com 2019 - 2024. All rights reserved.