我正在编写一个应用程序,用户可以在其中添加过滤器并根据需要将其删除。我想嵌套模块,其中过滤器是一个模块,添加和删除模块是第二个模块。
外部模块中的操作按钮触发第一个模块的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)