【发布时间】:2022-01-19 23:10:49
【问题描述】:
关于 SO 的这个主题有许多不同的 Q/A,但我找不到适合我用例的。我也很惊讶 RStudio / Shiny 开发人员自己没有提供一些关于如何做到这一点的文档。无论如何,以这个示例应用程序为例:
library(shiny)
library(glue)
library(tidyverse)
# Define UI for application
ui <- fluidPage(
# Application title
titlePanel("Test Multi-File Download"),
p("I hope this works!"),
downloadButton(
outputId = "download_btn",
label = "Download",
icon = icon("file-download")
)
)
# Define server logic
server <- function(input, output) {
#datasets stored in reactiveValues list
to_download <- reactiveValues(dataset1 = iris, dataset2 = airquality, dataset3 = mtcars, dataset4 = NULL)
blahblah <- iris
output$download_btn <- downloadHandler(
filename = function(){
paste("my_data_", Sys.Date(), ".csv", sep = "")
},
content = function(file){
#works
#readr::write_csv(blahblah, file)
#Attempt 1
# #create some temp directory
# temp_directory <- tempdir()
# browser()
# reactiveValuesToList(to_download) %>%
# #x is data, y is name
# imap(function(x,y){
# #browser()
# #check if data is not null
# if(!is.null(x)){
# #create file name based on name of dataset
# file_name <- glue("{y}_data.csv")
# #write file to temp directory
# readr::write_csv(x, file_name)
# }
# })
# zip::zip(
# zipfile = file,
# files = ls(temp_directory),
# root = temp_directory
# )
}
)
}
# Run the application
shinyApp(ui = ui, server = server)
我有一些数据集存储在reactiveValues 列表中,我希望用户能够下载它们。理想情况下,我希望他们能够一次下载多个文件,而不是必须zip 他们,然后下载.zip 文件。我可以接受的另一个选择是将每个数据集添加到 Excel 工作表,然后下载多工作表 Excel 文件。
我的一般思考过程(关于前者)如下:
- 下载按钮被按下
- 创建一些临时目录
- 将
to_downloadreactiveValues 列表中包含的(不是NULL)数据集写入此目录 -
zip临时目录并下载
我觉得我很接近,但是我还没有能够成功地完成这项工作。有什么想法吗?
编辑 1:我知道建议的答案 here,但想避免使用 setwd(),因为我认为在 Shiny 应用程序中弄乱工作目录是不好的做法。
【问题讨论】:
-
@NelsonGon 我已经阅读了这个问题,在我看来,在 Shiny 应用程序中使用
setwd()似乎(非常)不好的做法。如果可能的话,我想避免这种情况。 -
对于 multi_excel(啊,我被困在 tidyverse_syntax)表中,我认为您可以在按钮单击时循环通过 reactiveVals 并使用 openxl(sx) 或其他一些 excel 编写器写入表。
-
@NelsonGon 是的,我已经尝试过(使用
writexl::write_xlsx()),其方式与我在imap()中的注释方式类似,但未能成功提供一些条件来测试是否数据是否为NULL。