Блестящие вложенные модули: как генерировать наблюдатели для динамически генерируемых элементов пользовательского интерфейса? - PullRequest
0 голосов
/ 04 июля 2018

Я пытаюсь использовать вложенные модули в блестящей панели FlexDashboard. Код хорошо работает при генерации динамического ввода и вывода, но у меня возникают проблемы с использованием действий над ними в наблюдателях (также генерируемых модулем).

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

Упрощенный код, который я использую:

# inner module
DefVarsOutput<-function(input, output, session, VarsToIdentify){
          ns = session$ns
          len<- length(VarsToIdentify)
          #DefVarsOutputUI(PatentData,VarsToIdentify)

          output$DefVars<-renderUI({
                    tagList(
                              wellPanel( 
                                        lapply(1:len, function (x) {
                                                  wellPanel( 
                                                             p(paste0("Variable for ",VarsToIdentify[x])),
                                                             splitLayout(cellWidths = c("5%","5%", "90%"),
                                                                         actionButton(ns(paste0("Def_",VarsToIdentify[x])), 
                                                                                      icon("arrow-right", class = NULL, lib = "font-awesome"),style='padding:4px; font-size:80%'),
                                                                         wellPanel(style = "background-color: #ffffff;",
                                                                                   textOutput(ns(paste0("Selected_",VarsToIdentify[x])))
                                                                         )
                                                             ))
                                        }))
                    )})
          renderVarsObservers <-reactive(
                    lapply(1:len, function (x) {
                              observeEvent(input[[paste0("Def_", VarsToIdentify[x])]], {
                                        SelectedColX<-as.character(Columns[req(input$DataVars_row_last_clicked)])

                                        output[[paste0("Selected_",VarsToIdentify[x])]]<-renderText(SelectedColX)

                              },ignoreInit = TRUE)

                    })
          )

          return( renderVarsObservers())

} 

UI.DefVarsOutput <- function(id,label = "Add Selection bars")     {
          ns <-  NS(id)
          tagList(
                    uiOutput(ns("DefVars"))
          )
}     


# outer module
NewDataFormat <- function(input, output, session, VarsToIdentify) {
          ns<-session$ns
          #......
          DefVarsOutput2<-callModule(DefVarsOutput, VarsToIdentify=VarsToIdentify, "NewDataFormat2")
          DefVarsOutput2
          output$DefVarsUI<-renderUI({
                    tagList(

                              UI.DefVarsOutput(ns("NewDataFormat2") )
                    )
          })
}

UI.NewDataFormat <- function(id, label = "Add New Data Format") {
          # Create a namespace function using the provided id
          ns <- NS(id)

          tagList(
                      wellPanel( style='padding:4px',
                                 #tags$div( id = 'FormatError')
                                 uiOutput(ns("DefVarsUI"))

                      )
                    )

}

Код работал хорошо, прежде чем я пытался преобразовать их во вложенные модули (всего один уровень модуля) ...

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

Кодовый ввод [[name]], по-видимому, работает при использовании в качестве ввода для других элементов пользовательского интерфейса во внешнем модуле в этой ссылке и работал, когда он был во вложенном (или внешнем) модуле. ..

Так что я думаю, что это связано с тем, как наблюдатели передаются во внешний модуль, или изменяется идентификация элементов пользовательского интерфейса (может быть, что-то, связанное с сеансом) ... Я пробовал некоторые варианты, но пока не смог выяснить ... Как мы должны генерировать или передавать наблюдателей для / используя динамически генерируемые элементы пользовательского интерфейса?

Любая помощь приветствуется. Заранее спасибо

...