Shiny模块化downloadHandler无法下载更新后的数据表格问题
Shiny模块化下载按钮重复下载旧数据的解决方案
问题原因
你遇到的问题核心是reactive对象的传递方式错误:
- 非模块化代码中,
downloadHandler的content函数每次触发下载时都会调用summ_tbl()$df,实时获取最新的响应式数据 - 模块化代码里,你直接把
analysis_tbl()$df(已经求值的静态数据)传给了模块,模块初始化时就固定了这个值,后续数据更新不会同步到模块内部
修复后的模块化代码
UI部分(无需修改)
download_button_UI <- function(id, label = "", class = "btn-primary btn-xs", ...) { ns <- NS(id) downloadButton(ns("down_button"), label = label, icon = icon("download"), class = class, title = "Download", ...) }
Server部分(关键修改)
download_button_Server <- function(id, df_reactive, name, ...) { require(openxlsx) moduleServer(id, function(input, output, session) { output$down_button <- downloadHandler( filename = function() name, content = function(file) { # 每次下载时调用reactive对象获取最新数据 latest_df <- df_reactive()$df openxlsx::write.xlsx(latest_df, file) } ) }) }
调用方式修改
server <- function(input, output, session) { # 其他代码 # 直接传递reactive对象本身,不要加括号求值 download_button_Server(id = "down_analysis", df_reactive = analysis_tbl, name = "analysis.xlsx") # 其他代码 }
关于是否是Shiny已知Bug
这不是Shiny的Bug,是对Shiny响应式编程和模块化机制的使用误区。模块中如果接收的是已经求值的静态数据,只会在模块初始化时读取一次;只有传递reactive对象,并在需要的时机(比如下载触发时)调用它,才能拿到实时更新的数据。
内容的提问来源于stack exchange,提问作者Santiago Orantes
相关产品推荐
相关产品推荐

