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

Shiny应用中DT表格按钮第二次点击无响应问题求助

问题原因

这个问题确实和Shiny的输入绑定机制直接相关:

  • Shiny默认只会在输入值发生变化时,才会将前端的输入变更同步到后端、触发对应的观察者逻辑。
  • 你当前使用的Shiny.onInputChange("select_button", this.id)逻辑,第一次点击按钮时,select_button的值从空变为对应按钮ID,触发observeEvent;当你再次点击同一个按钮时,传给select_button的ID和上次完全一致,Shiny判定值没有变化,就不会触发后端的观察逻辑,所以点击无响应。
修复方案

只需要给Shiny.onInputChange添加第三个参数{priority: "event"}即可。这个参数的作用是告诉Shiny,每次调用都视为一次独立事件,无论传入的值是否和上一次相同,都会强制触发后端的观察者。
需要修改的代码段:
原onclick配置:

onclick = 'Shiny.onInputChange("select_button",  this.id)'

修改后:

onclick = 'Shiny.onInputChange("select_button",  this.id, {priority: "event"})'
修复后完整可运行代码
library(shiny)
library(DT)

ui <- fluidPage(
  DTOutput("df")
)

server <- function(input, output, session) {
  
  shinyInput <- function(FUN, len, id, ...) {
    inputs <- character(len)
    for (i in seq_len(len)) {
      inputs[i] <- as.character(FUN(paste0(id, i), ...))
    }
    inputs
  }
  
  output$df <- renderDT({
    iris$Edit = shinyInput(actionButton, nrow(iris), 'button_', label = "Edit", onclick = 'Shiny.onInputChange("select_button",  this.id, {priority: "event"})' )
    datatable(iris, escape = F) 
  })

  observeEvent(input$select_button,{
     selectedRow <- as.numeric(strsplit(input$select_button, "_")[[1]][2])

    showModal(modalDialog(
      title = "Edit", size = "l",
      fluidPage(width = 12,fluidRow(
        column(width = 3,selectedRow)
      )),
      footer = tagList(modalButton("Cancel"),actionButton("update", "Update"))))
  })
}

shinyApp(ui, server)

内容的提问来源于stack exchange,提问作者manu p

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 04:15:04