Tob*_*otz 7 namespaces module r modal-dialog shiny
我想在Shiny模块中使用模态窗口.用户与模态窗口交互,模块处理用户的输入.
在这个最小的例子中,模块应该在用户单击"关闭模式"按钮时删除模态:
library(shiny)
# Modal module UI
modalModuleUI <- function(id) {
ns <- NS(id)
actionButton(ns("openModalBtn"), "Open Modal")
}
# Modal module server
modalModule <- function(input, output, session) {
myModal <- function() {
modalDialog(
actionButton("closeModalBtn", "Close Modal")
)
}
# Show modal dialog on start up
observeEvent(input$openModalBtn,
ignoreNULL = FALSE,
showModal(myModal())
)
# close modal on button click (not working)
observeEvent(input$closeModalBtn, {
removeModal()
})
}
# Main app UI
ui <- fluidPage(modalModuleUI("foo"))
# Main app server
server <- function(input, output, session) {
callModule(modalModule, "foo")
}
shinyApp(ui, server)
Run Code Online (Sandbox Code Playgroud)
但是,单击"关闭模式"按钮不会触发observeEvent()模块服务器功能.我无法弄清楚如何访问(即观察)模块中模态窗口的内容.我想这是命名空间问题.
编辑:现在可以使用交互式示例.请参阅下面的答案.
Tob*_*otz 12
我在重新阅读了它自己这个更小心.与renderUI模态中的id元素一样需要被包装ns()以使它们在模块命名空间中可用.必须在显式使用模式内部加载名称空间ns <- session$ns,如下所示:
library(shiny)
# Modal module UI
modalModuleUI <- function(id) {
ns <- NS(id)
actionButton(ns("openModalBtn"), "Open Modal")
}
# Modal module server
modalModule <- function(input, output, session) {
myModal <- function() {
ns <- session$ns
modalDialog(actionButton(ns("closeModalBtn"), "Close Modal"))
}
# open modal on button click
observeEvent(input$openModalBtn,
ignoreNULL = FALSE, # Show modal on start up
showModal(myModal())
)
# close modal on button click
observeEvent(input$closeModalBtn, {
removeModal()
})
}
# Main app UI
ui <- fluidPage(modalModuleUI("foo"))
# Main app server
server <- function(input, output, session) {
callModule(modalModule, "foo")
}
shinyApp(ui, server)
Run Code Online (Sandbox Code Playgroud)
注意:如果myModal函数是在模块服务器函数之外定义的,则必须在调用它时传递会话,即showModal(myModal(session))和myModal <- function(session) {...}.
我已经更新了示例应用程序,以便它现在可以正常工作并添加了textInput.