1

我正在尝试通过 Openxlsx 包生成一个 .xlsx 文件,其中包含一个反应性名称和文件内的标题(输入变量是“ASL.1”和“Year.1”)。要保存在文件中的对象是反应表“tab_1()”,它是由应用程序生成的,没有任何问题,但是当我尝试下载它时,浏览器(Chrome)生成的名称不是(即) "Tab_1_TOSCANA_2015".xlsx" 但是 "download_tab_1",按钮 "download" 的 outputId 关联,什么也没有生成。我不明白问题出在哪里,因为我用 Openxlsx 检查了其他类似的例子,我没有看到错误在我的脚本中;如果我尝试使用“write.csv”命令编写一个 .csv 文件,一切正常。

脚本在这里:https ://drive.google.com/drive/folders/1dSI9qWgQyShjXjkJ2B6COuWzuWZie5IP?usp=sharing

该应用程序(这只是一小部分)是

https://cerimp-open-data.shinyapps.io/Malprof/

require(shiny)
require(dplyr)
require(reshape2)
require(stringr)
require(shinythemes)
require(ggplot2)
require(openxlsx)
require(leaflet)
require(RColorBrewer)
require(rgdal)
require(rgeos)
require(maptools)

load("dati.RData")

#### UI ####
ui <- fluidPage(
  theme = shinytheme("spacelab"),
  titlePanel("Indice"),
  navlistPanel(
    #### Tab I ####
    tabPanel(title = "Tab. I Tassi per ASL di competenza e Sesso",
             h1(textOutput(outputId = "tab_1_text"), style = "font-size:100%"), 
             fluidRow(column(3, selectInput(inputId = "ASL.1",
                                            label = "Territorio",
                                            choices = list("TOSCANA", "ASL CENTRO","ASL NORD-OVEST","ASL SUD-EST"),
                                            selected = "Toscana",
                                            multiple = FALSE)),
                      column(3, selectInput(inputId = "Anno.1",
                                            label = "Anno di manifestazione",
                                            choices = as.list(unique(malprof$Anno)),
                                            selected = max(malprof$Anno),
                                            multiple = FALSE))),
             fluidRow(column(2, downloadButton(outputId = "download_tab_1",
                                               label = "Scarica i dati"))),
             div(tableOutput(outputId = "tab_1"), style = "font-size:80%")
    ),  
    #### Fig 1 ####
    tabPanel(title = "Fig. 1 Andamento delle denunce INAIL e delle segnalazioni Malprof",
             h1(textOutput(outputId = "fig_1_text"),  style = "font-size:100%"),
             fluidRow(column(3, selectInput(inputId = "ASL.fig.1",
                                            label = "Territorio",
                                            choices = list("TOSCANA", "ASL CENTRO","ASL NORD-OVEST","ASL SUD-EST"),
                                            selected = "Toscana",
                                            multiple = FALSE))),
             div(plotOutput(outputId = "fig.1"), style = "font-size:80%")
    )
)


#### SERVER ####
server <- function(input, output) {

  fargs <- list(big.mark=".", decimal.mark=",") #parametri per la formattazione dei numeri nelle tabelle

  annoUltimo <- max(malprof$Anno)

  rg <- filter(malprof, ASL == "TOSCANA")
  no <- filter(malprof, ASL == "ASL NORD-OVEST")
  se <- filter(malprof, ASL == "ASL SUD-EST")
  ce <- filter(malprof, ASL == "ASL CENTRO")

  #### Tabella I - Distribuzione di frequenza delle segnalazioni di MP e dei relativi tassi per 100.000 abitanti suddivisi per ASL di competenza e Sesso  #### 
  selezioneASL.1 <- reactive({switch(input$ASL.1, 
                                     "TOSCANA" = rg,
                                     "ASL CENTRO" = ce,
                                     "ASL NORD-OVEST" = no,
                                     "ASL SUD-EST" = se)})

  tab.1 <- reactive({
    pop <- popTosc %>% filter(Anno == input$Anno.1) %>%
      dcast(EXASL ~ SEX, drop = T, fill = 0, fun.aggregate = sum, value.var = "N") %>%
      filter(!is.na(EXASL))   
    mp <- selezioneASL.1() %>% filter(Anno == input$Anno.1) %>%
      dcast(EXASL ~ sesso_lav, drop = T, fill = 0, fun.aggregate = length, value.var = "Anno")
    tab <- pop %>% inner_join(mp, by = c("EXASL" = "EXASL")) %>%
      mutate(T_F = round((F.y/F.x)*100000, 1), 
             T_M = round((M.y/M.x)*100000, 1)) %>%
       select(EXASL, F.x, M.x, F.y, M.y, T_F, T_M)
    tab.tot <- c("TOTALE", sum(tab$F.x), sum(tab$M.x), sum(tab$F.y), sum(tab$M.y), round((sum(tab$F.y)/sum(tab$F.x))*100000, 1), round((sum(tab$M.y)/sum(tab$M.x))*100000, 1))  
    tab <- rbind(tab, tab.tot)
    tab$F.x <- as.numeric(tab$F.x)
    tab$M.x <- as.numeric(tab$M.x)
    tab$F.y <- as.numeric(tab$F.y)
    tab$M.y <- as.numeric(tab$M.y)
    tab$T_F <- as.character(tab$T_F)
    tab$T_M <- as.character(tab$T_M)
    tab <- rename(tab, "EXASL" = EXASL, "Pop. F" = F.x, "Pop. M" = M.x, "Segn. F" = F.y, "Segn. M" = M.y, "Tasso - F" = T_F, "Tasso - M" = T_M)
    tab
  })

  output$tab_1_text <- renderText(paste0("Distribuzione di frequenza delle segnalazioni di MP e dei relativi tassi per 100.000 abitanti suddivisi per ASL di competenza e Sesso - ", input$ASL.1, ", ", input$Anno.1, "."))

  output$tab_1 <- renderTable({tab.1()}, 
                              display=c("s","s","d","d","d","d","s","s"), 
                              spacing="s",
                              align = 'lcccccc',
                              na="--", format.args=fargs)

    output$download_tab_1 <- downloadHandler(
    filename = function() {
      paste("Tab_1_", input$ASL.1, "_", input$Anno.1, ".xlsx", sep = "")
    },
    content = function(file) {
      wb <- createWorkbook()
      addWorksheet(wb, sheetName = "Dati", gridLines = TRUE)
      intestazione <- paste0("Distribuzione di frequenza delle segnalazioni di MP e dei relativi tassi per 100.000 abitanti suddivisi per ASL di competenza e Sesso - ", input$ASL.1, ", ", input$Anno.1, ".")
      writeData(wb, 1, x = intestazione)
      writeDataTable(wb, sheet = 1, startRow = 3, x = tab.1(), colNames = TRUE)
      saveWorkbook(wb, file)
    }
  )  
}

# Run the application 
shinyApp(ui = ui, server = server)
4

2 回答 2

3

我一直在努力解决听起来像同样的问题。这是由 downloadHandler (Shiny) 访问 openxlsx 包的问题引起的。没有任何修复权限或确保包位于正确的文件夹中。据我们所知,Shiny 下载处理程序与 openxlsx 交互存在问题。

最后,我通过保存 XLSX 的本地版本临时解决了这个问题,然后在 downloadHandler 中引用它。

将此部分(在 downloadHandler 内)移动到下载处理程序之外:

 addWorksheet(wb, sheetName = "Dati", gridLines = TRUE)
  intestazione <- paste0("Distribuzione di frequenza delle segnalazioni di MP e dei relativi tassi per 100.000 abitanti suddivisi per ASL di competenza e Sesso - ", input$ASL.1, ", ", input$Anno.1, ".")
  writeData(wb, 1, x = intestazione)
  writeDataTable(wb, sheet = 1, startRow = 3, x = tab.1(), colNames = TRUE)
  saveWorkbook(wb, file)

然后在处理程序内部使用这个版本:

    output$downloadData <- downloadHandler(
    filename = function(){paste0(intestazione,".xlsx")},
    content = function(file) {
file.copy(filename,file)

  #file.rename(fname,file)
}

)

于 2018-11-12T13:43:20.990 回答
1

我想我可以通过简单地在下载处理程序内的 saveWorkbook 函数中引用文件来让它工作......

这适用于 openxlsx 包和 Shiny downloadHandler :

 output$quick_export <- downloadHandler(
    filename = "my export.xlsx",
    content = function(file) {
      wb <- createWorkbook()
      addWorksheet(wb, "Cars")
      x <- mtcars[1:6, ]
      writeData(wb, "Cars", x, startCol = 2, startRow = 3, rowNames = TRUE)
      saveWorkbook(wb, file, overwrite = TRUE)
    }
  )
于 2020-05-27T07:46:29.067 回答