Shiny应用文件重新上传后Download按钮状态异常问题
解决Shiny应用上传新文件后Download按钮未自动禁用的问题
问题回顾
你开发的Shiny应用包含三个核心按钮:
- Upload:支持上传Excel文件
- Process:未上传文件时禁用,上传完成后启用
- Download:未处理文件时禁用,点击Process后启用
当前存在的问题:处理并下载第一个文件后,上传新文件时Download按钮仍保持启用状态,不符合「新文件完成处理前该按钮禁用」的预期。
解决方案
问题根源在于上传新文件时,未重置Download按钮的状态和处理标记。修改服务器端监听文件上传的逻辑,补充禁用Download按钮和重置处理状态的操作即可解决。
修改后的完整代码
library(readxl) library(tidyverse) library(writexl) library(bsplus) library(shinyalert) library(shinyjs) library(lubridate) ui <- fluidPage( shinyalert::useShinyalert(), useShinyjs(), titlePanel("Regularizer 15 min"), tags$div(id = "sidebar", sidebarPanel( bs_accordion( id = "accordion" ) %>% bs_set_opts( use_heading_link = TRUE ) %>% bs_append( title = tags$div(tags$i(class = "fa-solid fa-upload"),"Upload"), content = fileInput("upload", "Upload an Excel File", accept = c(".xlsx",".csv")) ), actionButton("act_button1", "Process", disabled = TRUE), use_bs_accordion_sidebar() )), mainPanel(id = "mainPanel", tags$div(class = "download-btn", downloadButton("downloadData_all", "Download Regularized", disabled = TRUE) ) ) ) server <- function(input, output, session) { options(shiny.maxRequestSize = 100*1024^2) data_processed <- reactiveVal(FALSE) # 修改文件上传监听逻辑,补充重置操作 observe({ if(!is.null(input$upload)){ shinyjs::enable("act_button1") # 上传新文件时禁用Download按钮,重置处理标记 shinyjs::disable("downloadData_all") data_processed(FALSE) } else { # 无文件时禁用Process和Download shinyjs::disable("act_button1") shinyjs::disable("downloadData_all") data_processed(FALSE) } }) observeEvent(input$act_button1, { data_processed(TRUE) shinyjs::enable("downloadData_all") }) observeEvent(input$downloadData_all, { if(is.null(input$upload)){ shinyalert::shinyalert("Error", "Please upload a file before downloading.", type = "error") } else if (!data_processed()) { shinyalert::shinyalert("Error", "Click Process before downloading.", type = "error") } }) output$downloadData_all <- downloadHandler( filename = function() { file_name <- input$upload$name paste("regularised_", file_name, ".xlsx", sep = "") }, content = function(file) { req(input$upload) data <- readxl::read_excel(input$upload$datapath, sheet = 1) writexl::write_xlsx(data, path = file) } ) } shinyApp(ui, server)
关键修改说明
- 上传新文件时重置状态:在监听
input$upload的observe中,新增shinyjs::disable("downloadData_all")和data_processed(FALSE),确保每次上传新文件后,Download按钮回到禁用状态,同时标记文件未处理。 - 完善无文件时的状态控制:补充了无文件上传时的逻辑,确保Process和Download按钮都保持禁用,状态更严谨。
内容的提问来源于stack exchange,提问作者Golem
相关产品推荐
相关产品推荐

