合并DT::datatable中的列

6
我需要在Shiny的DT::datatable中跨列合并单元格。最好的方法似乎是利用Javascript DataTables扩展程序RowGroup。但是我不知道从查看以上链接中的页面到在我的Shiny应用程序中合并单元格需要采取哪些步骤(有一个原因我正在使用Shiny;)。
这个stackoverflow问题的已接受答案中有一个部分答案,但是1)那是关于合并(即垂直合并而不是水平合并),2)R和Javascript交互的机制似乎被假定为先前的知识,让我有像“我需要从哪里下载哪些文件”和“我需要调整其中的Javascript代码吗?”这样的问题。
这是我的应用程序的简化示例:
library(shiny)
library(DT)

tbl <- data.frame("A"=c("foo", 1L, "question"),
                  "B"=c("bar", 2L, "answer"))

ui <- fluidPage(
  dataTableOutput("table")
)

server <- function(input, output) {

  output$table <- renderDT({
    datatable(tbl, rownames=F, class="",
              options = list(autoWidth=T,
                             columnDefs = list(list(className="dt-center", targets="_all"),
                                               list(width="40px", target="_all"))))
  })
}

shinyApp(ui = ui, server = server)

我想把这个表格

current table

变成这样

table with headers mergedtwo

1个回答

7
这可能适用于您,使用 htmltools
library(shiny)
library(DT)
library(htmltools)

tbl <- data.frame("A" = c( 1L, "question"),
                  "B" = c( 2L, "answer"))

container_dt= withTags(table(
  class = 'display',
  thead(
    tr(
      th(class = 'dt-center',colspan = 2, 'AB')),
      tr(
      lapply((c('foo', 'bar')), th)))))
     

ui <- fluidPage(
  dataTableOutput("table")
)

server <- function(input, output) {

    output$table <- renderDT({
        datatable(tbl, container = container_dt, rownames = F, class = "",
              options = list(autoWidth = T,
                             columnDefs = list(list(className = "dt-center", targets = "_all"),
                                               list(width = "40px", targets = "_all"))))
    })
}

shinyApp(ui = ui, server = server)

enter image description here


比起深入研究JavaScript教程,这要好得多!接受并点赞。 - Nibood_the_slightly_advanced
跟进问题:我在我的示例中应该包含一个位于我给出的列之前的列,我希望保持不变。这是否可能? - Nibood_the_slightly_advanced
我尝试了你的代码,但是它给了我这个错误 警告: Error in : options$columnDefs必须为NULL或子列表的列表,每个子列表必须包含一个targets`元素。'。我的R版本是4.2.1(2022-06-23),htmltools v0.5.3,shiny v1.7.2和DT v0.23。因此,某些内容已更改,现在在2022年无法正常工作。 - emr2
1
@emr2,您需要将columnDefs中的第二个子列表从target更改为targets。我会进行更新。 - Matt

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接