使用 R 在同一个 Excel sheet 中优雅地输出多个数据帧

Elegantly output several dataframes in the same Excel sheet with R

我目前正在尝试在同一个 Excel Sheet 中输出多个 R 数据帧。 我有一个生成 270 tables 的脚本。基本上,我想这样对 tables 进行分组:

我考虑过按以下方式对它们进行分组:

但这意味着我必须在工作时在每个文件之间跳转,这不太实用。我还考虑过使用 cbindsrbinds 将 15 tables 集合分组在一个数据框中,并使用空 rows/columns 来标记它们之间的分隔。但是,我对这个解决方案并不满意,因为它不是很优雅。

我不知道是否有任何软件包提供了这样做的可能性,或者 xslx/Rexcel 软件包是否提供了这种可能性,但我还没有找到它。当我试图找到这个问题的答案时,我只找到关于在不同 Excel sheets.

中写作的话题

如果有人知道解决方案,我们会很高兴:)。

我最近离开了 XLConnect,但过去我曾使用类似于下面的功能来处理此类事情。

require(XLConnect)
write_excel_gap <- function(path = NULL,
                            data_list = NULL,
                            gap = 1,
                            sheet = "Sheet1",
                            header = TRUE,
                            firstRow = 1,
                            add = FALSE,
                            addSheet = TRUE,
                            style = TRUE,...){

    stopifnot(length(gap) > 0,!is.null(path),!is.null(data_list))

    if (add){
        wb <- loadWorkbook(path,create = FALSE)
    }else{
        wb <- loadWorkbook(path,create = TRUE)
    }

    if (addSheet){
        createSheet(wb,sheet)
    }
    if (!style){
        setStyleAction(wb,XLC$"STYLE_ACTION.NONE")
    }

    n <- length(data_list)
    ng <- length(gap)
    dl_rows <- sapply(data_list,nrow)

    if (ng == 1){
        sr <- c(firstRow,firstRow + head(cumsum(dl_rows),-1)) + 
            c(0,cumsum(rep(gap,n-1)))
    }else{
        if(ng != n-1){
            warning("Length of gap is not one less than length of data_list. 
                            \nGap will be recycled as needed.")
        }
        sr <- c(firstRow,firstRow + head(cumsum(dl_rows),-1)) + 
            c(0,cumsum(gap))
    }

    if (header){
        writeWorksheet(object=wb,
                       data=data_list[[1]],
                       sheet=sheet,
                       startRow=firstRow,
                       header = TRUE,...)
        sr <- sr[-1] + 1
        writeWorksheet(object = wb,
                       data = data_list[-1],
                       sheet = sheet,
                       startRow = sr,
                       header = FALSE,...)
    }else{
        writeWorksheet(object = wb,
                       data = data_list,
                       sheet = sheet,
                       startRow = sr,
                       header = FALSE,...)
    }
    saveWorkbook(wb)
 }