如何在R中导出不同数量的数据框与ggplot图至Excel不同工作表?
问题原因
你的循环是按照graph_list的长度(5次)执行,但data_list仅包含2个数据框。当循环到第3次及以后时,data_list[[i]]会因为索引超出范围而报错,导致函数执行中断,后续的工作表创建和导出操作都无法完成,因此只导出了前2个数据框和图。
修改方案
根据你的需求,分两种常见场景给出修改代码:
场景1:仅导出现有2个数据框,同时导出全部5个图
如果不需要每个图都对应一个数据框工作表,仅需保留现有数据框并导出所有图,可修改函数,仅当索引i在data_list的有效范围内时,才创建并写入数据框工作表:
data_list = list(DF1, DF2) graph_list = list(G1, G2, G3, G4, G5) BOOK = createWorkbook() export_xl = function(i) { # 仅当i不超过数据框列表长度时,创建数据框工作表并写入 if (i <= length(data_list)) { data_sheet = paste("Data_Frame", i) addWorksheet(BOOK, data_sheet) writeData(BOOK, data_sheet, data_list[[i]]) } # 为每个图创建工作表并插入 plot_sheet = paste("Graph", i) addWorksheet(BOOK, plot_sheet) print(graph_list[[i]]) insertPlot(BOOK, plot_sheet, width = 5, height = 5) } # 循环所有图的索引 for (i in seq(length(graph_list))) { export_xl(i) } saveWorkbook(BOOK, "output.xlsx", overwrite = TRUE)
场景2:数据框与图一一对应(补全数据框列表)
如果你原本希望每个图都对应一个数据框,只是遗漏了部分数据框,只需将所有对应的数据框加入data_list,确保其长度与graph_list一致(5个),原代码即可正常运行:
# 补全data_list,确保包含5个数据框(示例为DF1到DF5,替换为你的实际数据框名) data_list = list(DF1, DF2, DF3, DF4, DF5) graph_list = list(G1, G2, G3, G4, G5) BOOK = createWorkbook() export_xl = function(i) { data_sheet = paste("Data_Frame", i) plot_sheet = paste("Graph", i) addWorksheet(BOOK, data_sheet) addWorksheet(BOOK, plot_sheet) writeData(BOOK, data_sheet, data_list[[i]]) print(graph_list[[i]]) insertPlot(BOOK, plot_sheet, width = 5, height = 5) } for (i in seq(length(graph_list))) { export_xl(i) } saveWorkbook(BOOK, "output.xlsx", overwrite = TRUE)
注意:代码中
path.xlsx需替换为实际的文件路径(如"output.xlsx"),否则会因变量未定义报错。
内容的提问来源于stack exchange,提问作者Homer Jay Simpson
相关产品推荐
相关产品推荐

