【问题标题】:Saving multiple data-frames to single csv file using Shiny downloadHandler使用 Shiny downloadHandler 将多个数据帧保存到单个 csv 文件
【发布时间】:2018-03-08 02:58:40
【问题描述】:

我有一个 RShiny 应用程序,我在其中跨不同的选项卡设置面板显示多个数据框。我希望能够将出现在每个面板上的数据帧写入每个面板的一个 csv 文件。我目前正在尝试使用 Shiny 的 downloadHandler 选项来渲染它。

做了一些研究,发现我可以使用 sink() 函数将 R 输出转移到文件中。

这是我尝试将 sink() 合并到 server.R 端的一个这样的按钮中的尝试

output$downloadDemographic <- downloadHandler(
filename = function() {
  paste('Demographics', '.csv', sep='')
},
content = function(file) {
  sink("Demographics.csv")
  cat('Population Demographics')
  write.csv(Population)
  cat('Geography Demographics')
  write.csv(Geography)
  sink()
}
) 

其中PopulationGeography 是具有相同列数但名称不同的两个数据框。

接收器功能自动将上述数据帧写入我的工作目录中的 csv 文件“Demographics.csv”,但 Shiny 上的 downloadHandler 选项会提示用户即时保存 csv 文件。有点与我在这里想要实现的目标相矛盾。我可能遗漏了什么或犯了一个明显的错误,我不知道。

所需的输出 - https://i.stack.imgur.com/yddrE.jpg

我可以渲染多个下载按钮,将每个数据帧写入多个 csv 文件,但我的一些选项卡设置元素有多达 8 个数据帧,这会使 UI 混乱。

我可以在写入 csv 文件之前将多个数据帧强制为一个,但它们都是大小不等的数据帧,将它们格式化为所需的输出将是一个巨大的痛苦。

对我如何以其他方式建立这一点有任何想法吗?

谢谢!

【问题讨论】:

    标签: r export-to-csv shiny


    【解决方案1】:

    其他选项:

    1. Write an Excel workbook with one sheet per dataframe
    2. Zip together multiple csv files

    这是使用 R 数据集包中的四个数据框的两个选项的示例。

    library(shiny)
    library(xlsx)
    
    shinyApp(
        ui = fluidPage(
            downloadButton("downloadExcelSheet", "Download Excel Workbook with Multiple Sheets"),
            downloadButton("downloadZippedCSV", "Download zipped csv files")
        ),
        server = function(input, output) { 
    
            #### Write an Excel workbook with one sheet per dataframe ####
            output$downloadExcelSheet <- downloadHandler(
                filename = function() {
                    "excelWorkbook.xlsx"
                },
                content = function(file) {
                    # write workbook and first sheet
                    write.xlsx(mtcars, file, sheetName = "mtcars", append = FALSE)
    
                    # add other sheets for each dataframe
                    listOtherFiles <- list(iris = iris, 
                                           airquality = airquality, 
                                           sleep = sleep)
                    for(i in 1:length(listOtherFiles)) {
                        write.xlsx(listOtherFiles[i], file, 
                                   sheetName = names(listOtherFiles)[i], append = TRUE)
                    }
                }
            )
    
            #### Zip together multiple csv files ####
            output$downloadZippedCSV <- downloadHandler(
                filename = function() {
                    "zippedCSV.zip"
                },
                content = function(file) {
                    # go to temp dir to avoid permission issues
                    owd <- setwd(tempdir())
                    on.exit(setwd(owd))
    
                    # create list of dataframes and NULL value to store fileNames
                    listDataFrames <- list(mtcars = mtcars, 
                                           iris = iris,
                                           airquality = airquality,
                                           sleep = sleep)
                    allFileNames <- NULL
    
                    # loop through each dataframe
                    for(i in 1:length(listDataFrames)) {
                        # write each dataframe as csv and save fileName
                        fileName <- paste0(names(listDataFrames)[i], ".csv")
                        write.csv(listDataFrames[1], fileName)
                        allFileNames <- c(fileName, allFileNames)
                    }
    
                    # write the zip file
                    zip(file, allFileNames) 
    
                }
            )
        }
    )
    

    【讨论】:

    • 谢谢@blondeclover,你是救生员!我喜欢第一个示例,我可以将工作簿与不同的工作表拼接在一起。 Excel 上的格式有点不对,但将文本转换为数字对我来说是诀窍。
    • 我仍然希望能够将这两个数据帧解析到同一张纸上。我闪亮的应用程序中的每个选项卡面板都应该显示不同信息的切片 - 在这种情况下,“人口”和“地理”是两个不同的数据框,在我的应用程序的“人口统计”选项卡上传达信息
    • @AshwinRamesh 您的用户是否需要能够编辑下载的表格或将它们导入 R?如果没有,您可以使用 RMarkdown 在同一页面上制作包含两个表格的 PDF
    • @blonderclover 表格需要输出为 Excel 文件。该应用程序根据用户提供的输入(Csv 文件上传)计算 14 个数据帧。这些数据框出现在 7 个选项卡面板中。将它们下载到 14 个 excel 工作表上会涉及一些后处理工作,因为其中一些数据帧本质上是属于该特征的不同指标。像属于 Demographic 特征的 Population & Geography。 7 张 excel 表 - 每个选项卡一张是完美的。所以结合你的解决方案和我最初的问题。
    猜你喜欢
    • 2021-10-24
    • 1970-01-01
    • 2016-02-03
    • 1970-01-01
    • 2014-12-29
    • 2011-07-16
    • 2012-03-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多