在R Shiny的DT::renderDataTable中添加下载按钮遇问题求助
解决R Shiny中DT表格下载按钮不工作的问题
我懂你碰到的这个麻烦——在DT::renderDataTable里嵌套DT::datatable后,那些copy/csv/excel/pdf下载按钮就失效了,但直接用renderDataTable却没问题。这其实是因为你用错了renderDataTable的正确用法,下面给你拆解原因和解决方案:
问题根源
DT::renderDataTable的设计逻辑是:它可以直接接收数据对象(比如你的plots.dfs()[[1]]),同时支持直接传入DT的配置参数(比如options、class、extensions这些)。如果你在里面嵌套DT::datatable(),相当于把一个已经构建好的DT对象传给了renderDataTable,这会打乱它内部的依赖加载和渲染流程,尤其是按钮所需的Buttons扩展没法正确初始化。
正确的写法(推荐)
直接把数据和配置参数传给renderDataTable,不需要嵌套datatable(),同时别忘了加上extensions = 'Buttons'(这是下载按钮必须的扩展):
output$mytable1 <- DT::renderDataTable( # 直接传数据对象 plots.dfs()[[1]], rownames = TRUE, class = "display", # 加载Buttons扩展 extensions = 'Buttons', options = list( fixedColumns = TRUE, autoWidth = TRUE, ordering = FALSE, # dom参数里的B对应按钮容器,t对应表格 dom = 'tB', buttons = c('copy', 'csv', 'excel', 'pdf') ) )
如果你一定要用嵌套写法(不推荐)
如果因为某些场景必须用DT::datatable()构建表格对象,那要把它放在一个表达式块里(用大括号{}包裹),同时同样要加上extensions = 'Buttons':
output$mytable1 <- DT::renderDataTable({ DT::datatable( plots.dfs()[[1]], rownames = TRUE, class = "display", extensions = 'Buttons', options = list( fixedColumns = TRUE, autoWidth = TRUE, ordering = FALSE, dom = 'tB', buttons = c('copy', 'csv', 'excel', 'pdf') ) ) })
额外注意事项
- UI部分必须用
DT::dataTableOutput("mytable1"),不能用普通的tableOutput,否则DT的交互功能(包括按钮)都没法正常工作。 - 确保你的DT包是最新版本,旧版本可能存在扩展加载的bug,可以用
update.packages("DT")更新。
内容的提问来源于stack exchange,提问作者Remi
相关产品推荐
相关产品推荐

