R Shiny模块传入响应式数据框不更新问题排查
Shiny模块响应式失效问题修复
模块内表格不随下拉选择更新
问题出在模块Server的调用传参上。
你写的data_show_Server("a",df = PROJ_RESULTS_04()),是在应用刚启动的时候就执行了一次响应式计算,把当时返回的静态数据框传进了模块,根本没把响应式对象本身传进去。模块拿不到输入和数据之间的依赖关系,切换下拉选项的时候自然不会触发重渲染。非模块区域的表格是写在主server逻辑里,直接调用PROJ_RESULTS_04()建立了响应式关联,所以能正常更新。
修复要点:给模块传响应式对象的时候,不要加后面的括号,直接写对象名就行,只有在模块内部需要取数据值的时候,再加括号调用。
模块内预处理数据后表格无法显示
问题出在对Shiny响应式对象的理解偏差上:
- 用
reactive({})赋值得到的对象本质是个封装了响应式逻辑的函数,不是直接算好的数据框 - 只有在对象后面加
()执行它,才能拿到最新的计算结果,同时自动建立响应式依赖 - 最开始你直接把
newdf这个函数传给renderDataTable,入参类型不对,当然渲染不出表格,改成newdf()传入实际处理好的数据框之后,功能就正常了
修正后完整可运行代码
library(shiny) # 预存测试数据 ---- df1 <- data.frame(team=c('A', 'A', 'A', 'A', 'A', 'A', 'A', 'A'), points=c(6, 14, 15, 19, 22, 25, 39, 34)) df2 <- data.frame(team=c('B', 'B', 'B', 'B', 'B', 'B','B', 'B'), points=c(1, 2, 3, 4, 5, 6, 7, 8)) saveRDS(df1,"PROJ_RESULTS_04_202203") saveRDS(df2,"PROJ_RESULTS_04_202204") # 模块UI ----- data_show_UI <- function(id) { ns <- NS(id) tagList(dataTableOutput(ns("table01"))) } # 模块Server ----- data_show_Server <- function(id, df){ moduleServer(id, function(input, output, session) { # 对传入的响应式数据做预处理 newdf <- reactive({ head(df()) }) output$table01 <- renderDataTable({ newdf() }) }) } # 应用UI ----- ui <- fluidPage(titlePanel("dynamic data input"), fluidRow( wellPanel( # 选择年月 selectInput( inputId = "selectInput_01", label = "Year Month", choices = c(202203, 202204), selected = 202203, selectize = TRUE ) )), fluidRow( hr("模块区域"), data_show_UI("a") ), fluidRow( hr("非模块区域"), dataTableOutput("table_01") ) ) # 应用server ----- server <- function(input, output, session) { PROJ_RESULTS_04 <- reactive({ x <- paste0("PROJ_RESULTS_04_", input$selectInput_01) readRDS(x) }) output$table_01 <- renderDataTable({ PROJ_RESULTS_04() }) # 传参时直接传响应式对象,不要加括号 data_show_Server("a", df = PROJ_RESULTS_04) } shinyApp(ui, server)
内容的提问来源于stack exchange,提问作者Nuwan
相关产品推荐
相关产品推荐

