You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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)

关键修改说明

  1. 上传新文件时重置状态:在监听input$upload的observe中,新增shinyjs::disable("downloadData_all")和data_processed(FALSE),确保每次上传新文件后,Download按钮回到禁用状态,同时标记文件未处理。
  2. 完善无文件时的状态控制:补充了无文件上传时的逻辑,确保Process和Download按钮都保持禁用,状态更严谨。

内容的提问来源于stack exchange,提问作者Golem

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.13 23:17:49