R Shiny模块中insertUI与actionButton结合实现Excel上传的问题咨询
问题根因
- 模块内的DOM元素会自动加上命名空间前缀,原代码中insertUI的selector直接写
#AddExcelDataButton无法匹配到实际的按钮DOM元素,导致插入逻辑不生效 - 插入的fileInput组件的inputId也需要套上模块命名空间,否则后续无法在模块内读取该输入的返回值
修正后可运行的完整代码
library(shiny) Import.Excel.Data.UI <- function(id){ ns <- NS(id) tagList( actionButton(ns("AddExcelDataButton"), label = "Click Here to Add Excel Data") ) } Import.Excel.Data.Server <- function(id){ moduleServer(id, function(input, output, session){ ns <- session$ns observeEvent(input$AddExcelDataButton, { insertUI( # 选择器加上命名空间,匹配模块内的实际按钮ID selector = paste0("#", ns("AddExcelDataButton")), where = "afterEnd", ui = fileInput( # 新增输入组件ID加命名空间,后续可在模块内正常读取 inputId = ns(paste0("File", input$AddExcelDataButton)), label = paste0("Path for File", input$AddExcelDataButton), multiple = FALSE ) ) }) }) } Import.Excel.Data.App <- function(){ ui <- fluidPage( Import.Excel.Data.UI("File1") ) server <- function(input, output, session){ Import.Excel.Data.Server("File1") } shinyApp(ui, server) } Import.Excel.Data.App()
后续如果要读取插入的文件输入值,直接在模块逻辑中通过input[[paste0("File", 对应点击次数)]]即可获取到文件的datapath等信息。
内容的提问来源于stack exchange,提问作者K.RAC
相关产品推荐
相关产品推荐

