闪亮-嵌套模块:如何为动态生成的UI元素生成观察器?

时间:2018-07-04 15:16:38

标签: r module shiny observers flexdashboard

我试图在闪亮的flexdashboard中使用嵌套模块。 该代码在动态生成输入和输出中效果很好,但是在观察者中对它们进行操作(也由模块生成)时,我遇到了问题。

我看到了有关嵌套模块和UI元素的问题,以及与反应式(here, for example)有关的问题。但是我没有发现与那些UI元素的动态生成的观察者有关的任何东西...

我正在使用的简化代码是:

# 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()命名UI元素,并且它们是正确生成的,但是当我单击动作按钮时没有任何动作发生。

代码输入[[name]]用作this link中外部模块中其他UI元素的输入时有效,而在非嵌套(或外部)模块中时有效... < / p>

所以我认为这与将观察者传递到外部模块或修改UI元素标识(可能与会话有关)有关。我尝试了一些选项,但还无法弄清楚...我们应该如何为动态生成的UI元素生成或传递观察者?

感谢您的帮助。预先感谢

0 个答案:

没有答案