Shiny应用点击下载按钮后添加下载等待提示功能的实现咨询
实现方案
我们仅需对原有下载逻辑做少量修改即可实现需求:利用Shiny自带的通知组件,在文件生成前弹出持久化的下载提示,文件生成完成后自动关闭提示。修改后的完整可运行代码如下:
library(shiny) library(shinythemes) library(dplyr) library(writexl) library(tidyverse) library(lubridate) function.test<-function(){ df1 <- structure( list(date1= c("2021-06-28","2021-06-28","2021-06-28"), date2 = c("2021-07-01","2021-07-02","2021-07-04"), Category = c("ABC","ABC","ABC"), Week= c("Wednesday","Wednesday","Wednesday"), DR1 = c(4,1,0), DR01 = c(4,1,0), DR02= c(4,2,0),DR03= c(9,5,0), DR04 = c(5,4,0),DR05 = c(5,4,0),DR06 = c(5,4,0),DR07 = c(5,4,0),DR08 = c(5,4,0)), class = "data.frame", row.names = c(NA, -3L)) return(df1) } return_coef <- function(df1, dmda, CategoryChosse) { x<-df1 %>% select(starts_with("DR0")) x<-cbind(df1, setNames(df1$DR1 - x, paste0(names(x), "_PV"))) PV<-select(x, date2,Week, Category, DR1, ends_with("PV")) med<-PV %>% group_by(Category,Week) %>% summarize(across(ends_with("PV"), median)) SPV<-df1%>% inner_join(med, by = c('Category', 'Week')) %>% mutate(across(matches("^DR0\\d+$"), ~.x + get(paste0(cur_column(), '_PV')), .names = '{col}_{col}_PV')) %>% select(date1:Category, DR01_DR01_PV:last_col()) SPV<-data.frame(SPV) mat1 <- df1 %>% filter(date2 == dmda, Category == CategoryChosse) %>% select(starts_with("DR0")) %>% pivot_longer(cols = everything()) %>% arrange(desc(row_number())) %>% mutate(cs = cumsum(value)) %>% filter(cs == 0) %>% pull(name) (dropnames <- paste0(mat1,"_",mat1, "_PV")) SPV <- SPV %>% filter(date2 == dmda, Category == CategoryChosse) %>% select(-any_of(dropnames)) if(length(grep("DR0", names(SPV))) == 0) { SPV[head(mat1,10)] <- NA_real_ } datas <-SPV %>% filter(date2 == ymd(dmda)) %>% group_by(Category) %>% summarize(across(starts_with("DR0"), sum)) %>% pivot_longer(cols= -Category, names_pattern = "DR0(.+)", values_to = "val") %>% mutate(name = readr::parse_number(name)) colnames(datas)[-1]<-c("Days","Numbers") datas <- datas %>% group_by(Category) %>% slice((as.Date(dmda) - min(as.Date(df1$date1) [ df1$Category == first(Category)])):max(Days)+1) %>% ungroup m<-df1 %>% group_by(Category,Week) %>% summarize(across(starts_with("DR1"), mean)) m<-subset(m, Week == df1$Week[match(ymd(dmda), ymd(df1$date2))] & Category == CategoryChosse)$DR1 if (nrow(datas)<=2){ return (as.numeric(m)) } else if(any(table(datas$Numbers) >= 3) & length(unique(datas$Numbers)) == 1){ yz <- unique(datas$Numbers) return(as.numeric(yz)) } else{ mod <- nls(Numbers ~ b1*Days^2+b2,start = list(b1 = 0,b2 = 0),data = datas, algorithm = "port") return(as.numeric(coef(mod)[2])) } } ui <- fluidPage( shiny::navbarPage(theme = shinytheme("flatly"), collapsible = TRUE, br(), tabPanel("", sidebarLayout( sidebarPanel( uiOutput('daterange'), br() ), mainPanel( dataTableOutput('table'), br(), br(), downloadButton("dl", "Download") ), )) )) server <- function(input, output,session) { data <- reactive(function.test()) data_subset <- reactive({ req(input$daterange1) req(input$daterange1[1] <= input$daterange1[2]) days <- seq(input$daterange1[1], input$daterange1[2], by = 'day') df1 <- subset(data(), as.Date(date2) %in% days) df2 <- df1 %>% select(date2,Category) Test <- cbind(df2, coef = apply(df2, 1, function(x) {return_coef(df1,x[1],x[2])})) Test }) output$daterange <- renderUI({ dateRangeInput("daterange1", "Period you want to see:", min = min(data()$date2), max = max(data()$date2)) }) output$table <- renderDataTable({ data_subset() }) output$dl <- downloadHandler( filename = function() { "data.xlsx"}, content = function(file) { # 弹出下载中提示,设置duration为NULL则一直展示到手动关闭 showNotification( ui = "请稍候,电子表格正在下载中", id = "download_notice", duration = NULL, type = "message" ) writexl::write_xlsx(data_subset(), path = file) # 文件生成完成后关闭提示 removeNotification(id = "download_notice") } ) } shinyApp(ui = ui, server = server)
可选参数调整说明
如果需要自定义提示效果,可以修改showNotification的参数:
- 修改
duration参数为数字(单位为秒)即可设置固定展示时长,到期后提示自动消失 - 修改
position参数可调整提示展示位置,可选值为bottom-right/top-right/bottom-left/top-left - 修改
type参数可切换提示样式,可选值为message/warning/error
内容的提问来源于stack exchange,提问作者Antonio
相关产品推荐
相关产品推荐

