Home > Enterprise >  Post message after hitting download button
Post message after hitting download button

Time:10-17

The code below generates a table and it is also possible to download this table just press the Download button. As I have a small database here, it works pretty fast. However, I'm using a much larger database, so I'd like to insert some message after the person presses the button, like: "Wait a few moments while your spreadsheet downloads".This message could have a duration or perhaps appear until the moment of finalizing the download. Could you help me do this?

Executable code below:

  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)
        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:",
                       start = min(data()$date2),
                       end   = max(data()$date2))
      })
      
      output$table <- renderDataTable({
        data_subset()
      })
      
      output$dl <- downloadHandler(
        filename = function() { "data.xlsx"},
        content = function(file) {
          writexl::write_xlsx(data_subset(), path = file)
        }
      )
    }
    
    shinyApp(ui = ui, server = server) 

CodePudding user response:

You could try this: In your downloadHandler use showModal

... 
output$dl <- downloadHandler(
    filename = function() { "data.xlsx"},
    content = function(file) {
      showModal(modalDialog("Downloading", footer=NULL))
      on.exit(removeModal())
      writexl::write_xlsx(data_subset(), path = file)
    }
  )
...
  • Related