R中使用for循环/map2遍历双列表实现openxlsx批量写Excel问题
核心错误原因
你使用c()存储多个数据框时,R会将数据框按列拆分后合并为扁平化列表,不会保留每个数据框的独立结构,因此你定义的names_of_dataframes实际长度为所有数据框的列数总和(25),和8个工作表名称的长度不匹配,触发map2的长度校验报错。
修复步骤
1. 修正数据框的存储方式
将存储数据框的c()替换为list(),保留每个数据框的独立结构:
names_of_dataframes <- list( total_suppliers, nato_fvey_suppliers, us_suppliers, sole_sourcing, single_sourcing, geographic_risk_us_only, foreign_dependence, exposure_to_non_nato_fvey )
2. 功能实现(两种可选方案)
方案1:基础for循环实现
R的for循环不支持直接同步遍历两个向量,可通过索引遍历实现:
# 遍历索引同步匹配工作表名和对应数据框 for (i in seq_along(names_of_worksheets)) { # 先创建对应名称的工作表(必须前置步骤,否则writeData无法找到目标工作表) openxlsx::addWorksheet(workbook, sheetName = names_of_worksheets[i]) # 写入对应数据 openxlsx::writeData(workbook, sheet = names_of_worksheets[i], x = names_of_dataframes[[i]]) }
方案2:purrr包函数实现
使用walk2(仅执行副作用,无返回值,比map2更适配写入场景)实现:
library(purrr) # 先批量创建所有工作表 walk(names_of_worksheets, ~openxlsx::addWorksheet(workbook, .x)) # 批量匹配写入数据 walk2( .x = names_of_worksheets, .y = names_of_dataframes, .f = ~openxlsx::writeData(workbook, sheet = .x, x = .y) )
内容的提问来源于stack exchange,提问作者Ben G
相关产品推荐
相关产品推荐

