Shiny golem模块传递响应式值 下拉切换数据集DT不更新问题
问题根因
DT表格无法随下拉选择刷新,是模块间传递响应式值的两处写法错误导致的:
- 主服务层调用筛选模块时,给返回的响应式对象错误添加了括号,仅获取了应用启动时的初始数据集静态值,丢失了响应式联动能力
- 表格渲染模块中直接将传入的响应式对象传入
DT::renderDataTable,未在渲染上下文里取响应式的实时值,无法触发重绘逻辑
修复步骤
仅需修改两处代码:
- 主服务层向表格模块传值时,去掉
df_dataset_val后的括号,传入完整的响应式对象,而非某一时刻的静态快照 - 表格模块的渲染逻辑中,给传入的
df加括号,在每次渲染时读取响应式的最新值
修复后可运行代码
library(tidyverse) library(shiny) # 模块定义 ## 数据集选择模块 mod_filter_source_ui <- function(id) { ns <- NS(id) tagList( shiny::selectInput( ns("dataset"), label = "select dataset", choices = c("cars", "pressure", "diamonds"), selectize = TRUE ) ) } mod_filter_source_server <- function(id) { moduleServer(id, function(input, output, session) { df_dataset <- shiny::reactive({ switch(input$dataset, "cars"= cars, "pressure" = pressure, "diamonds" = diamonds) }) return(df_dataset) }) } ## 表格渲染模块 mod_table_ui <- function(id){ ns <- NS(id) tagList( DT::dataTableOutput(ns("table_out")) ) } mod_table_server <- function(id, df){ moduleServer( id, function(input, output, session){ # 修复:响应式对象取值需加括号 output$table_out <- DT::renderDataTable(df()) }) } # 应用层 app_ui <- function(request) { tagList( fluidPage( mod_filter_source_ui("selected_dataset"), mod_table_ui("main_table") ) ) } app_server <- function(input, output, session) { df_dataset_val <- mod_filter_source_server("selected_dataset") # 修复:传入响应式对象本身,不要加括号取静态值 mod_table_server("main_table", df = df_dataset_val) } # 启动应用 shinyApp(app_ui, app_server)
注意要点
shiny::reactive()生成的响应式对象本质是一个特殊函数,只有在其他响应式上下文(包括render*系列函数、observe*系列函数、其他响应式表达式内部)加括号调用时,才会建立依赖关联:当响应式值变化时,所有依赖它的下游逻辑会自动重新执行。如果在非响应式上下文加括号调用,只会拿到调用瞬间的静态值,后续值的变化不会被感知。
内容的提问来源于stack exchange,提问作者M. Wood
相关产品推荐
相关产品推荐

