You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.04 15:27:03