首页 > 解决方案 > 将多个小标题导出到 XLSX -- 使用 deparse(substitute()) 时的 sheetName 问题

问题描述

我有 15 个小标题要导出到单个 XLSX 工作簿,每个集合的 sheetName 与小标题对象的名称相同。要导出单个 tibble,这很好用:

library(xlsx)

    my_tibble1 %>% 
      write.xlsx("output_filename.xlsx", 
                 sheetName = "my_tibble1", 
                 append = TRUE)

然而,这些 tibbles 的数量已经足够多,因此为每个 tibbles 写出所有这些都非常耗时。所以,我写了一个函数:

output_expediter <- function(df, output_filename) {
      write.xlsx(df, 
                 output_filename, 
                 sheetName = deparse(substitute(df)), 
                 append = TRUE)

此函数成功地将 tibble 写入输出工作簿中的新工作表,但 sheetName 始终是单个句点(“。”)。

用于小写字母的所有变量名称都仅限于小写字符和下划线,并且它们的长度都是 31 个或更少的字符,所以我认为它们中的任何一个都不会违反 XLSX 格式约定。在 R 控制台中,运行:

deparse(substitute(my_tibble1))

按预期产生“my_tibble1”。

为什么会发生这种情况的任何想法?除了输入每张纸的名称之外,还有什么可能的解决方法吗?

标签: rr-xlsx

解决方案


一个选项是openxlsx

library(openxlsx)
library(tibble)
output_expediter <- function(df, output_filename) {
     nm1 <- deparse(substitute(df))
     wb <- createWorkbook()
     addWorksheet(wb, sheetName = nm1)
     writeData(wb, sheet= nm1, x = df)
     saveWorkbook(wb =wb, file = output_filename, overwrite = TRUE)
     }


file1 <- "hello.xlsx"
df1 <- tibble(col1 = 1:5, col2 = 6:10)
output_expediter(df1, file1)

-输出

在此处输入图像描述


如果我们需要编写多个文件,

library(purrr)    
wb1 <- createWorkbook()
output_expediter <- function(df, wb, nm1, output_filename) {


     addWorksheet(wb, sheetName = nm1)
     writeData(wb, sheet= nm1, x = df)
     saveWorkbook(wb =wb, file = output_filename, overwrite = TRUE)
     }

lst1 <- lst(df1= df1, df2= df1)
iwalk(lst1, ~ output_expediter(.x, wb = wb1, .y, file))

在此处输入图像描述


推荐阅读