R Shiny中DT表格选中行值捕获错误问题求解
问题根源
你当前代码的错误核心是两点:
input$[DT输出ID]_rows_selected返回的是DT组件当前渲染的表格的相对行索引(从1开始计数),不是原始数据集的行名,你用全局asd的行名和这个索引匹配逻辑完全不成立- 你在
renderDataTable内部临时修改了asd变量,和全局的原始asd变量冲突,过滤后的子集行名和全局数据行名不对应
修正方案
把第一个表格的过滤逻辑抽为独立的响应式变量,直接从过滤后的响应式数据中取选中索引对应的行即可,修正后的完整代码如下:
library(shiny) library(DT) library(dplyr) asd <- data.frame(a = c(7,7,8,8,2,1,3,5,5,6), b = c("A","B","C","A","B","C","A","B","C","F")) ui <- fluidPage( selectInput("sel","Select",choices = asd$b), dataTableOutput("tab"), dataTableOutput("txt") ) server <- function(input, output, session) { # 抽离第一个表格的过滤逻辑为响应式变量,避免重复计算和变量冲突 filtered_data <- reactive({ asd %>% filter(b %in% input$sel) }) ## 第一个表格 output$tab <- renderDataTable({ datatable(filtered_data(), selection = 'single') }) ## 第二个表格 output$txt <- renderDataTable({ # 先判断是否有行被选中,避免初始化报错 req(input$tab_rows_selected) # 直接从过滤后的响应式数据中取对应索引的行即可 datatable(filtered_data()[input$tab_rows_selected, ]) }) } shinyApp(ui, server)
关键修改说明
- 新增了响应式变量
filtered_data统一管理第一个表格的数据源,保证两个表格取用的过滤后数据完全一致 - 移除了错误的行名匹配逻辑,直接用DT返回的行索引取过滤后数据的对应行
- 新增
req(input$tab_rows_selected)避免页面初始化时无选中行抛出的报错
内容的提问来源于stack exchange,提问作者manu p
相关产品推荐
相关产品推荐

