与闪亮的动态嵌套模块交互?

时间:2019-10-07 12:49:22

标签: shiny shiny-server shiny-reactivity shinymodules

我正在编写一个应用程序,用户可以在其中添加过滤器并根据需要将其删除。我想嵌套模块,其中过滤器是一个模块,添加和删除模块是第二个模块。

外部模块中的操作按钮触发第一个模块的insertUI和removeUI的创建。我有一个问题,当我使用嵌套模块时,事件没有被触发,但是如果我将外部模块转换为应用程序,则模块将正确触发。

内部模块看起来像这样

    index_dUI<-function(id){
  ns<-NS(id)
  tagList(    div(id = id,
                  selectInput(inputId = ns("filter"),label="Subset by",choices=c("none","a","b","c"),selected="none")
  )
  ) 
}

index_d<-function(input,output,session){
  observeEvent(input$filter,{
    print(input$filter)
  })


}

现在,第二个模块按如下方式调用第一个模块:

index_tabUI<-function(id){
  ns<-NS(id)
  ui <- fluidPage(
    actionButton(ns('add'), '+'),
    actionButton(ns('remove'), '-'),
    tags$div(id = 'placeholder')
  )
}

index_tab<-function(input,output,session){
  ###Required! ####
  uiCount = reactiveVal(0)
  moduleOuts = reactiveValues()
  observeEvent(input$add, {
    uiCount(uiCount()+1)
    insertUI('#placeholder',
             'beforeBegin',
             index_dUI(paste0("module",uiCount())))
    moduleOuts[[as.character(uiCount())]] = callModule(
      module = index_d,
      id = paste0("module",uiCount()))
  })
  observeEvent(input$remove,{
    # if remove button is pressed, remove the UI and reduce the UI count
    removeUI(
      selector = paste0("#module",uiCount())
    )

    uiCount(uiCount()-1)
  })
}

应用程序在这里:

ui <- fluidPage(
  index_tabUI("filter_tab")
)
server <- function(input, output, session) {
  index<-callModule(index_tab,"filter_tab")

}
shinyApp(ui = ui, server = server)

单击加号和-按钮确实会触发内部模块的创建和销毁,但是更改每个过滤器的值不会触发打印。如果我将第二个模块修改为应用程序,则它将按预期工作。我的怀疑是模块嵌套时ID不匹配,也许我需要以某种方式在第二个模块的服务器部分中添加NS函数。 将外部模块修改为可以正常运行的应用程序可以正常工作:

ui<-fluidPage(
    actionButton('add', '+'),
    actionButton('remove', '-'),
    tags$div(id = 'placeholder')
  )

server<-function(input,output,session){
  ###Required! ####
  uiCount = reactiveVal(0)
  moduleOuts = reactiveValues()
  observeEvent(input$add, {
    uiCount(uiCount()+1)
    insertUI('#placeholder',
             'beforeBegin',
             index_dUI(paste0("module",uiCount())))
    moduleOuts[[as.character(uiCount())]] = callModule(
      module = index_d,
      id = paste0("module",uiCount()))
  })
  observeEvent(input$remove,{
    # if remove button is pressed, remove the UI and reduce the UI count
    removeUI(
      selector = paste0("#module",uiCount())
    )

    uiCount(uiCount()-1)
  })




}
shinyApp(ui = ui, server = server)

0 个答案:

没有答案