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

如何在模块化Shiny的DataTable中为按钮创建JS事件?

解决Shiny模块中DT内按钮点击事件的命名空间问题

问题核心是模块环境下,Shiny.setInputValue的目标输入ID必须包含模块命名空间,同时要正确把R循环中的索引值传递给JavaScript。

修改后的代码

library(shiny)
library(DT)
library(tibble)

uiModuleImpl <- function(id) {
  ns <- NS(id)
  
  tabPanel(
    title = "Dummy title",
    DTOutput(ns("dummyDT")),
    textOutput(ns("myText")),
    value = id
  )
}

serverModuleImpl <- function(id) {
  moduleServer(id, function(input, output, session) {
    ns <- session$ns
    
    output$dummyDT <- renderDT({
      dummyData <- tibble(
        "Col A" = c(2000, 1994),
        "Col B" = c(2019, 2023),
      )

      dummyData$Calculate <- vapply(X=1:2, function(i) {
        target_input <- ns("idxToProcess")
        as.character(
          actionButton(
            inputId = ns(paste0("actionButton_", i)),
            label = "Calculate",
            onclick = sprintf('Shiny.setInputValue("%s", %d, {priority: "event"})', target_input, i)
          )
        )
      }, character(1))
      
      dummyData
    },
    escape = FALSE,
    selection = "none"
    )
    
    observe({
      print(paste("idx =", input$idxToProcess))
    })

    output$myText <- renderText({
      req(input$idxToProcess)
      paste("idx =", input$idxToProcess)
    })
  })
}

ui <- fluidPage(
  uiModuleImpl("someNamespace")
)

server <- function(input, output, session) {
  serverModuleImpl("someNamespace")
}

shinyApp(ui = ui, server = server)

关键修改点

  • 命名空间处理:用ns("idxToProcess")获取带命名空间的输入ID,确保Shiny能正确识别模块内的输入。
  • 索引值传递:通过sprintf把R循环中的i值直接注入JavaScript代码,替换原来的变量i,这样点击按钮时会传递具体的索引数值。
  • 引号转义:使用双引号包裹输入ID,避免和外层的单引号冲突,确保JS代码语法正确。

内容的提问来源于stack exchange,提问作者J. Grünenwald

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.12 22:00:01