问题描述
我正在寻找一个简单的模块化设计的Shiny应用程序的帮助。我认为问题是名称空间问题,因此下面的示例被设置为我实际项目的简化版本。我的感觉是我没有将output$uis
设置为正确的名称空间,但是我迷失了如何映射到它。
该应用会生成select_formUI
的3个实例,并且应该是与callModules
的{{1}}的服务器返回值的3个实例相关的命名空间。 select_form
中的值会以小标题的形式传递出去。内部模块将所有3个小标题绑定为一个反应性小标题select_form
。
在我取消注释all_gen_forms_rctv
中的input_slt_type_db
列并返回pass_back_test
之前,该过程正常进行。我正在寻找帮助,请在输出中包括此列,并查看input$slt_type_db
通过all_gen_forms_rctv
对用户选择的更改。
output$outpt_test
解决方法
问题在于select_form模块的UI函数不知道在另一个模块中正在调用它。因此,您需要通过将ID包裹在session$ns
中来告知它。 callModule
函数可以自行处理,因此这里无需更改任何内容。 inner_module
函数看起来像这样
inner_module <- function(input,output,session) {
rctval_ui <- reactiveValues(all_ui=NULL)
gen_forms <- reactiveValues()
all_gen_forms_rctv <- reactive({
browser()
dplyr::bind_rows(lapply(reactiveValuesToList(gen_forms),function(current_module_output) {
current_module_output$pass_back_test()
}))
})
observeEvent(input$btn_start,{
for(i in 1:3){
x_id = glue("mod_{i}")
rctval_ui$all_ui[[x_id]] <- select_formUI(session$ns(x_id))
gen_forms[[x_id]] <- callModule(select_form,x_id)
}
})
output$outpt_forms_ui <- renderUI({
ns <- session$ns
tagList(
actionButton(ns('btn_start'),label = 'start'),verbatimTextOutput(ns('outpt_test')),hr(),uiOutput(ns('uis'))
)
})
output$uis <- renderUI({
ns <- session$ns
tags$div(id = environment(ns)[['namespace']],tagList(rctval_ui$all_ui))
})
output$outpt_test <- renderPrint({all_gen_forms_rctv()})
}