Взаимодействовать с динамическими вложенными модулями в году? - PullRequest
0 голосов
/ 07 октября 2019

Я кодирую приложение, в котором пользователь может добавлять фильтры и удалять их по мере необходимости. Я хотел вложить модули, где фильтры - это один модуль, а модуль добавления и удаления - второй.

Кнопка действия во внешних модулях запускает создание 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)
...