折叠行组闪亮

An *_*ist 2 javascript jquery r datatables shiny

我有相当简单的应用程序(如下),我尝试使用具有折叠组功能的 DataTable 输出分组表。我在这里找到了在 jQuery 中实现的解决方案,但我不知道如何将如此复杂的实现转移到 R 中。

目前,我能够在一个团体内崩溃,但不能崩溃整个团体本身。有什么提示可以在 Shiny 中实现吗?

我的应用程序:

library(shiny)
library(DT)
library(shinyjs)

ui <- fluidPage(

   # Application title
   titlePanel("Collapse/Expand table"),

            mainPanel(
          DTOutput("my_table")

      )
   )


server <- function(input, output) {

    output$my_table<-DT::renderDataTable({

        datatable(mtcars[1:15,1:5],
                  extensions = 'RowGroup', 
                  options = list(rowGroup = list(dataSrc=c(3)),
                                 pageLength = 20),
                  callback = JS("
                                table.on('click', 'tr', function () {
                                    var rowsCollapse = $(this).nextUntil('.group');
                                    $(rowsCollapse).toggleClass('hidden');
                                 });"))
    })
}

# Run the application 
shinyApp(ui = ui, server = server)
Run Code Online (Sandbox Code Playgroud)

编辑

给定 AEF 注释,我们可以调整代码以指定一旦单击表主体就必须执行该操作。这确实会折叠任何行直到下一组。剩下的部分是将点击限制为仅对组行。现在回调应该是:

callback = JS("$('#DataTables_Table_0 tbody').on('click', 'tr', function () {
 $(this).nextUntil('.group').toggleClass('hidden');});"))
Run Code Online (Sandbox Code Playgroud)

Shr*_*Tan 6

事实证明这是DT的javascript代码的一个bug。有一个单击事件侦听器,它将记录单击单元格的所有信息。但是,RowGroup 扩展会创建不属于原始数据集的新行并导致错误。此错误会停止进一步的 JavaScript 执行。

在您的情况下,tr.group由于上一个单元格单击事件引发的错误,该事件不起作用。

我们已经修复了这个错误,DT 的开发版本应该可以使用以下代码:

library(shiny)
library(DT)
ui <- fluidPage(# Application title
  titlePanel("Collapse/Expand table"),
  mainPanel(DTOutput("my_table")))

callback_js <- JS(
  "table.on('click', 'tr.dtrg-group', function () {",
  "  var rowsCollapse = $(this).nextUntil('.dtrg-group');",
  "  $(rowsCollapse).toggleClass('hidden');",
  "});"
)

server <- function(input, output) {
  output$my_table <- DT::renderDT({
    datatable(
      mtcars[1:15, 1:5],
      extensions = 'RowGroup',
      options = list(rowGroup = list(dataSrc = 3), pageLength = 20),
      callback = callback_js,
      selection = 'none'
    )
  })
}

# Run the application
shinyApp(ui = ui, server = server)

Run Code Online (Sandbox Code Playgroud)

再次感谢您的报道!

DT 的 Github 问题的代码:https ://github.com/rstudio/DT/issues/759