R Shiny中基于同表响应实现DT单元格更新的问题求解
问题原因
- 调用
replaceData时参数不匹配:renderDT中指定了rownames = TRUE,但替换数据时没有传入相同配置,DT无法对齐行列结构,导致数据替换失效。 - 下拉框选中状态被固定重置:原有代码生成的GROUP列下拉框固定选中A选项,每次替换数据后会覆盖用户的选择,看起来像更新操作没有生效。
修复后的完整代码
library(shiny) library(DT) ui <- fluidPage( h4("Reactivity within table: fixed version."), fluidRow( DTOutput(outputId = "tableNR"), verbatimTextOutput('selectedGroupNR') ) ) server <- function(input, output, session) { getData <- reactive({ # 动态获取当前选中的分组值,为空则默认A current_selected <- if(is.null(input$selectNR)) "A" else input$selectNR # 动态生成下拉框HTML,匹配当前选中状态 group_select_html <- sprintf( '<select id="selectNR" class="form-control"> <option value="A" %s>A</option> <option value="B" %s>B</option> <option value="C" %s>C</option> </select>', if(current_selected == "A") "selected" else "", if(current_selected == "B") "selected" else "", if(current_selected == "C") "selected" else "" ) data.frame( GROUP = group_select_html, ANIMAL = switch(current_selected, "A" = "Dog", "B" = "Cat", "C" = "Fish"), stringsAsFactors = FALSE, check.names = FALSE ) }) output$tableNR <- renderDT({ datatable( data = isolate(getData()), selection = "none", escape = FALSE, rownames = TRUE, options = list( dom = 't', preDrawCallback = JS('function() { Shiny.unbindAll(this.api().table().node()); }'), # 每次重绘后绑定Shiny输入,同时初始化selectize drawCallback = JS('function() { Shiny.bindAll(this.api().table().node()); $("#selectNR").selectize(); }') ) ) }) proxyNR <- dataTableProxy('tableNR') observeEvent(input$selectNR, { toReplace <- getData() # 传入rownames=TRUE和renderDT配置对齐 DT::replaceData(proxyNR, toReplace, resetPaging = TRUE, rownames = TRUE) }) output$selectedGroupNR <- renderPrint({ paste0('Selected group = ', input$selectNR) }) } shinyApp(ui = ui, server = server)
内容的提问来源于stack exchange,提问作者Han Bossier
相关产品推荐
相关产品推荐

