如何在Shiny的DT datatable中添加可重置排序、替换数据的内置按钮
问题原因
你当前代码点击无响应的核心问题是:DT按钮的JS逻辑中尝试触发id为reset_sort的元素点击事件,但你的UI中没有定义该元素,导致事件无法传递到服务端。
修正后可运行代码
以下代码完全保留DT内置按钮的形式,同时支持触发服务端的数据替换、排序重置逻辑:
library(DT) library(shiny) library(shinyjs) # 全局排序清除函数 clearSorting <- function(proxy) { shinyjs::runjs(paste0("$('#' + document.getElementById('", proxy$id,"').getElementsByTagName('table')[0].id).dataTable().fnSort([]);")) } # 前端UI ui <- fluidPage( # 新增隐藏按钮,承接DT按钮的点击事件 actionButton(inputId = "reset_sort", label = "", style = "display: none;"), DT::DTOutput(outputId = "table"), shinyjs::useShinyjs() ) # 服务端逻辑 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)
改动说明
仅在UI中新增了一个隐藏的actionButton,作为DT内置按钮和服务端观察事件的中间承接载体,完全不影响页面显示效果,同时满足所有需求。
内容的提问来源于stack exchange,提问作者CaseebRamos
相关产品推荐
相关产品推荐

