r - 在 Shiny 模块中使用模态窗口

标签 r module shiny namespaces modal-dialog

我想在 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)

但是,单击“关闭模态”按钮不会触发模块服务器函数中的 observeEvent()。我无法弄清楚如何访问(即观察)模块中模式窗口的内容。我猜这是一个命名空间问题。

编辑:interactive example现在可以了。请参阅下面我的回答。

最佳答案

重读this后我自己弄清楚了更仔细地。就像 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)

注意:如果 myModal 函数定义在模块服务器函数之外,则调用它时必须传递 session ,即showModal(myModal(session))myModal <- function(session) {...} .

我已经更新了 example app这样它现在就可以工作了,并且还添加了一个 textInput。

关于r - 在 Shiny 模块中使用模态窗口,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48127459/

相关文章:

r - 制作一个可管道化的函数

javascript - 模块中的返回值返回空?

function - 在 Fortran90 的同一模块中调用函数

r - 如何在从 Shiny 的下拉框中选择变量时动态创建直方图

R 使用行数向量将数据帧分解为列表

r - 如何在 nMDS(纯素)中使一个因素显示为符号,而另一个因素显示为颜色?

两个不重叠的 `data.table` s 的滚动连接

angularjs - 如何在 Angular 2 中使用 amcharts 的 ammaps?

r - Shiny 的如何更新存储在 react 中的值?

r - 如何有效地对 R Shiny 中的数据框进行子集化?