Я кодирую приложение, в котором пользователь может добавлять фильтры и удалять их по мере необходимости. Я хотел вложить модули, где фильтры - это один модуль, а модуль добавления и удаления - второй.
Кнопка действия во внешних модулях запускает создание 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)
Нажатие кнопок плюс и -действительно вызывает создание и уничтожение внутреннего модуля, но изменение значений каждого фильтра не вызывает печать. Если я изменю второй модуль, чтобы он стал приложением, то он будет работать как положено. Я подозреваю, что идентификаторы не совпадают, когда модули вложены, возможно, мне нужно как-то добавить функции 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)