Shiny中ModalDialog内调用insertUI报错及无法插入UI问题求助
问题成因
- 第一类崩溃报错:
insertUI是Shiny服务端的执行函数,不属于UI组件,你直接将其作为参数传入modalDialog()时,modalDialog会尝试将所有传入参数解析为可渲染的UI标签,函数本身是闭包(closure)类型,无法被转换为字符型的UI渲染内容,因此直接抛出错误。 - 第二类无渲染问题:添加
immediate = T后函数会立即执行插入逻辑,但此时showModal还没完成模态框的DOM渲染,你指定的目标选择器#constraintPlaceholder还不存在于页面DOM树中,插入操作没有生效目标,自然不会显示对应内容。
修复方案
将insertUI调用移到showModal语句外部,保证模态框渲染完成后再执行插入操作,修正后的可运行代码如下:
library(shiny) ui <- fluidPage( actionButton("add", "addConstraints") ) server <- function(input, output, session) { observeEvent(input$add, { # 先渲染模态框 showModal(modalDialog( selectizeInput(session$ns("constraintType"), label = "Select constraint type", choices = c("Comparison", "Numeric", "Interval")), tags$div(id = session$ns("constraintPlaceholder")), title = "Set Constraints", footer = tagList( modalButton("Cancel"), actionButton(session$ns("confirmConstraint"), "Add") ) )) # 模态框渲染完成后再执行插入UI操作 insertUI( selector = paste0("#", session$ns("constraintPlaceholder")), where = "afterEnd", ui = HTML("test") ) }) } shinyApp(ui, server)
如果插入内容是模态框打开时就要显示的固定内容,也可以直接把对应的UI写在modalDialog的参数列表中,不需要调用insertUI,性能更优。如果是需要后续触发其他事件再插入UI,只要保证插入时目标选择器对应的DOM元素已经存在即可。
内容的提问来源于stack exchange,提问作者sedsiv
相关产品推荐
相关产品推荐

