我正在尝试将多个数据框保存到单个工作簿的多个表中,其中工作表名称与df名称相同。
让我们在df $ 1
列表中将以下内容拆分为df 10
,我如何将它们保存到工作表名为1到10的工作簿中。
library(tidyverse)
library(openxlsx)
data <- tibble( x = 1:10,
y = runif(10,0.1,10),
z = runif(10,0.1,10))
df <- split(data, data$x)
wb <- loadWorkbook("template.xlsx")
这里缺少步骤,我厌倦了使用purrr:map(对purrr和R普遍不了解),但不确定如何馈送df $ {1
对应于名为1的工作表。 >
map(df,function(x) x %>%
writeData(wb,.....)
saveWorkbook(wb, "finished_workbook.xlsx")
非常感谢您的帮助:)
答案 0 :(得分:1)
您不需要外部软件包,mapply
可以满足您的需求。
请注意,工作簿"template.xlsx"
必须已经存在。
library(openxlsx)
df <- split(data, data$x)
wb <- loadWorkbook("template.xlsx")
现在棘手的部分。 mapply
调用此函数以将名为"1"
的工作表中的几个表写入"10"
。
函数fun
假定工作表已经存在,但不假定它们为空。首先查看每张纸有多少张表,如果有(length(g) > 0
,则将它们全部删除。只有这样,它才会写入表x
,并用tryCatch
包裹对writeDataTable
的调用,以捕获可能的错误。
如果有错误,请返回,如果没有,则返回字符串"Ok"
。
fun <- function(s, x){
g <- getTables(wb, sheet = s)
if(length(g) > 0){
sapply(g, function(.g) removeTable(wb, s, .g))
}
err <- tryCatch(writeDataTable(wb, s, x),
error = function(e) e)
if(inherits(err, "error")) err else "Ok"
}
mapply(fun, names(df), df)
# 1 2 3 4 5 6 7 8 9 10
#"Ok" "Ok" "Ok" "Ok" "Ok" "Ok" "Ok" "Ok" "Ok" "Ok"
saveWorkbook(wb, "template.xlsx", overwrite = TRUE)