在闪亮的数据表中进行主动重置排序或替换数据表按钮

Make an active reset sort or replace datatable button in datatable in shiny

我正在尝试在数据中放置一个按钮table,如果用户想要重置排序列,他们可以点击该按钮,table 将被重置或更改为原始顺序。目前,当我按下按钮时,它不会触发任何点击事件。该事件应该替换服务器部分的数据。

我目前正在关注这些帖子:

  1. https://github.com/rstudio/DT/issues/76

然而,在上面的最后两个帖子中,即使他们完成了工作,按钮也不是数据的一部分table。

这是我的代表:

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

# function placed in the global.R
clearSorting <- function(proxy) {
  shinyjs::runjs(paste0("$('#' + document.getElementById('", proxy$id,"').getElementsByTagName('table')[0].id).dataTable().fnSort([]);"))
}

# ui.R
ui <- fluidPage(
  DT::DTOutput(outputId = "table"),
  shinyjs::useShinyjs()
)

# servcer.R
server <- function(input, output) {
  
  output$table <- renderDT({
    
    DT::datatable(data = iris,
                  filter = 'top',
                  extensions = c('Buttons'),
                  
                  options = list(scrollY = 600,
                                 scrollX = TRUE,
                                 autoWidth = TRUE,
                                 dom =  '<"float-left"l><"float-right"f>rt<"row"<"col-sm-4"B><"col-sm-4"i><"col-sm-4"p>>',
                                 buttons = list(
                                   list(
                                     extend = '',
                                     text = 'Reset Table',
                                     action = JS("function() {document.getElementById('reset_sort').click();}")
                                   )
                                 ),
                                 scrollCollapse= TRUE,
                                 lengthChange = TRUE,
                                 widthChange= TRUE))
  })
  
  observeEvent(input$reset_sort, {
    
    data <- iris
    
    clearSorting(proxy = DT::dataTableProxy(outputId = "table"))
    
    DT::replaceData(proxy = DT::dataTableProxy(outputId = "table"),
                data = data,
                rownames = FALSE)
    
  })
  
}

shinyApp(ui = ui, server = server)

这里有一个方法:

library(DT)

js <- c(
  "function(e, dt, node, config){",
  "  dt.iterator('table', function(s){",
  "    s.aaSorting.length = 0;",
  "    s.aiDisplay.sort(function(a,b){",
  "       return a-b;",
  "    });",
  "    s.aiDisplayMaster.sort(function(a,b){",
  "       return a-b;",
  "    });",
  "  }).draw();",
  "}"
)

datatable(
  iris,
  extensions = "Buttons",
  options = list(
    dom = "Bfrtip",
    buttons = list(
      list(
        extend = "collection", 
        text = "Reset columns order", 
        action = JS(js)
      )
    )
  )
)

要在 Shiny 中使用它,您可能需要在 renderDT 中设置 server = FALSE:

output$table <- renderDT({
  ......
}, server = FALSE)