【问题标题】:Post message after hitting download button点击下载按钮后发布消息
【发布时间】:2021-10-16 14:43:05
【问题描述】:

下面的代码生成一个表格,也可以下载这个表格,只需点击下载按钮。因为我这里有一个小型数据库,所以它运行得非常快。但是,我使用的是一个更大的数据库,所以我想在用户按下按钮后插入一些消息,例如:“在您的电子表格下载时稍等片刻”。此消息可能会持续一段时间,也可能会出现直到完成下载的那一刻。你能帮我做这件事吗?

可执行代码如下:

  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) {
          writexl::write_xlsx(data_subset(), path = file)
        }
      )
    }
    
    shinyApp(ui = ui, server = server) 

【问题讨论】:

    标签: r shiny


    【解决方案1】:

    你可以试试这个:在你的downloadHandler 中使用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)
        }
      )
    ...
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多