Shiny模块间无法通信传递数据,应用响应性失效问题咨询
问题原因
你的应用无响应的核心原因是跨模块传递响应式值时错误解包了reactive对象:mod_selectVar_server返回的values是一个reactive对象,只有在Shiny的响应式上下文(reactive()/observe()/render*()系列函数内部)中调用该对象才会触发响应链。你直接在主server中写values()$meanVar,相当于只获取了应用初始化时的静态值,后续values更新不会同步到第二个模块。
修复方案
需要修改两处代码:
- 主server中向第二个模块传参时,传递响应式对象,不要提前解包取值
- 第二个模块的服务端逻辑中,在
renderText内部调用传入的响应式对象获取最新值
如果你不想调整第二个模块的参数结构,也可以在主server传参时将每个统计值单独包裹为reactive表达式即可,无需改动模块1的逻辑。
修复后完整代码
### Module 1 mod_selectVar_ui <- function(id){ ns <- NS(id) tagList( selectInput(ns("dataset"), "Choose a dataset:",choices = c("rock", "pressure", "cars")), selectInput(ns("colonnes"),label = "Choose some columns", choices = NULL, multiple = FALSE), tableOutput(ns("table")) ) } mod_selectVar_server <- function(id){ moduleServer(id, function(input, output, session){ datasetInput <- reactive({ switch(input$dataset, "rock" = rock, "pressure" = pressure, "cars" = cars) }) observe({ colonnes <- names(datasetInput()) updateSelectInput( session, "colonnes", choices = colonnes) }) data <- reactive({ req(input$colonnes) datasetInput()[, input$colonnes] }) output$table <- renderTable({ head(data()) }) values <- reactive({ list( meanVar = mean(data()), maxVar = max(data()), minVar = min(data()), sdVar = sd(data()) ) }) return(values) }) } ### Module 2 mod_textOu_ui <- function(id){ ns <- shiny::NS(id) shiny::tagList( shiny::textOutput(ns("txt")) ) } mod_textOu_server <- function(id, texte){ moduleServer(id, function(input, output, session){ output$txt <- renderText({ # 在响应式上下文中调用reactive对象 texte() }) } ) } ### Main App ui <- fluidPage( fluidRow( column(3, mod_textOu_ui("1") ), column(3, mod_textOu_ui("2") ), column(3, mod_textOu_ui("3") ), column(3, mod_textOu_ui("4") ) ), fluidRow( mod_selectVar_ui("1") ) ) server <- function(input, output, session){ values <- mod_selectVar_server("1") # 传参时包裹为reactive表达式,保留响应性 mod_textOu_server("1", reactive(values()$meanVar)) mod_textOu_server("2", reactive(values()$maxVar)) mod_textOu_server("3", reactive(values()$minVar)) mod_textOu_server("4", reactive(values()$sdVar)) } shinyApp(ui ,server )
内容的提问来源于stack exchange,提问作者Abdelouahed BEN MHAMED
相关产品推荐
相关产品推荐

