R Shiny + DT场景下如何下载DT表格搜索筛选后的数据集
解决方案
核心原理是DT组件会自动向Shiny的input对象暴露当前表格的筛选后行索引,你可以直接调用input$[你的DT表格id]_rows_all获取所有符合当前DT筛选条件的行号,结合你原有的自定义筛选结果提取对应数据即可。
需要修改的部分只有downloadHandler的内容逻辑,修改后完整可运行代码如下:
library(shiny) library(shinyWidgets) library(DT) library(dplyr) library(readr) ### small helper function dt_output = function(title, id) { fluidRow(column( 12, h1(paste0(title)), hr(), DTOutput(id) )) } df <- tibble(animal=rep(c("dog", "fish", "cat"), 10), code=rep(LETTERS[1:10],3), price_tag=c(rep("high",10),rep("average",10), rep("low",10)) ) ui <- fluidPage( sidebarLayout( sidebarPanel( pickerInput("mypet","Select animal type", choices=c("cat", "dog", "fish"), selected="fish", options = list(`actions-box` = TRUE, `selected-text-format` = "count > 3"),multiple = T), downloadButton("downloadData", "Download your selection") ), mainPanel( dt_output("Raw Data Selection","table") ) ) ) server <- function(input, output) { df_filter <- reactive({ df %>% filter(animal %in% input$mypet) }) output$table <- renderDT({datatable(df_filter())}) output$downloadData <- downloadHandler( filename = function() { paste("filtered_data.csv") }, content = function(file) { # 获取DT筛选后的行索引,提取对应数据 filtered_rows <- input$table_rows_all final_df <- df_filter()[filtered_rows, ] write_csv(final_df, file) } ) } shinyApp(ui = ui, server = server)
该方案不需要修改你原有基于reactive的业务逻辑,也不需要预设筛选条件,DT自带的全局搜索、列筛选、排序后的结果都可以直接通过input$table_rows_all拿到完整的符合条件的行索引,导出的结果和页面上可见的所有筛选结果完全一致。如果你的业务数据量极大,需要开启DT服务端渲染提升加载速度,input$table_rows_all仍然可以正常返回所有符合筛选条件的行索引,不需要额外修改逻辑。
内容的提问来源于stack exchange,提问作者larry77
相关产品推荐
相关产品推荐

