Shiny中如何调用DT datatable筛选功能,通过单选按钮过滤指定列数据
该需求完全可以实现,核心是使用DT的客户端筛选能力,不在服务端提前过滤原始数据集,即可完整保留_rows_selected等DT内置交互功能。
实现思路
- 开启DT的客户端渲染模式,全量原始数据会加载到前端,筛选操作完全在前端执行,服务端行索引不会发生变化
- 通过
dataTableProxy获取DT实例,监听单选框值的变化,调用DT的列筛选API对vs列执行精准匹配筛选
完整可运行代码
library(DT) library(shiny) ui <- basicPage( h2("The mtcars data"), radioButtons("vs_radio", label="filter on vs", c("0" = "0", "1" = "1"), inline = TRUE), DT::dataTableOutput("mytable") ) server <- function(input, output) { output$mytable = DT::renderDT({ mtcars }, server = FALSE) # 关键:开启客户端模式,全量数据加载到前端 # 监听单选框变化,执行前端列筛选 observeEvent(input$vs_radio, { proxy <- dataTableProxy("mytable") # vs列为mtcars第8列,按单选框选中值执行精准匹配筛选 updateSearch(proxy, list(columns = c("", "", "", "", "", "", "", input$vs_radio, "", "", ""))) }) } shinyApp(ui, server)
补充说明
server = FALSE是实现该需求的核心配置,只有客户端模式下全量数据才会保留在前端,筛选不会改变服务端对应的行索引- 如果需要增加"全部"选项,只需要在
radioButtons的选项中新增"全部" = ""即可,筛选值为空时会自动展示所有行 - 该方案下所有DT内置交互功能(行选中、排序、自带搜索框等)都可正常使用,
input$mytable_rows_selected返回的行号和原始mtcars数据集的行号完全对应,无需额外做映射转换
内容的提问来源于stack exchange,提问作者tafelplankje
相关产品推荐
相关产品推荐

