如何让R Shiny golem模块中的下载按钮正常导出.xlsx文件
问题原因
- 模块UI中的下载按钮ID未经过命名空间
ns()包裹:Shiny模块要求所有UI元素的ID必须用当前模块的ns()函数处理,才能和服务器端的输出对应上。你当前的mod_download_ui中直接写了downloadButton("downloadData"),没有套ns(),导致服务器端的downloadHandler无法和UI按钮绑定,点击后会返回错误页(也就是你拿到的.html文件)。 - 可选优化点:文件名中的
Sys.time()默认输出包含冒号、空格等特殊字符,部分操作系统会不识别该文件名,建议格式化时间字符串。同时建议明确指定write_xlsx的所属包,避免依赖加载问题。
修改后的代码
mod_download.R(核心修改)
#' download UI Function #' #' @description A shiny Module. #' #' @param id,input,output,session Internal parameters for {shiny}. #' #' @noRd #' #' @importFrom shiny NS tagList mod_download_ui <- function(id){ ns <- NS(id) tagList( # 核心修改:给id套上ns() downloadButton(ns("downloadData"), "Download Metrics Reports") ) } #' download Server Function #' #' @noRd #' @importFrom writexl write_xlsx mod_download_server <- function(input, output, session){ ns <- session$ns data_xi <- data.frame(s = c(1:3),r = c(4:6), x =c(19:21)) output$downloadData <- downloadHandler( # 优化文件名格式,避免特殊字符 filename = function(){ paste0(format(Sys.time(), "%Y%m%d_%H%M%S"), '_site_mtx.xlsx') }, content = function(file){ write_xlsx(data_xi, file) } ) }
app_server.R和app_ui.R无需修改,保持原有逻辑即可。
内容的提问来源于stack exchange,提问作者tycheo
相关产品推荐
相关产品推荐

