如何在模块化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
相关产品推荐
相关产品推荐

