R语言双层for循环读取CSV文件出现列表元素NULL异常问题
R双层for循环读取CSV存入列表索引异常问题分析与解决方案
异常产生逻辑
问题的核心是j*k的索引计算逻辑存在天然缺陷:
- 你共有2类typ、8类freq,总计16个待读取的CSV文件,需要16个不重复的连续索引存储结果
- 当外层循环
j=1时,内层循环k从1到8,计算得到的索引为1、2、3、4、5、6、7、8 - 当外层循环
j=2时,内层循环k从1到8,计算得到的索引为2、4、6、8、10、12、14、16 - 由此产生两个问题:
- 索引
2、4、6、8会被重复赋值,j=1对应的读取结果会被j=2的结果覆盖 - 索引
9、11、13、15从未被赋值,R列表中未显式赋值的位置默认返回NULL,就是你观察到的奇数位置为空的原因
- 索引
正确实现方式
通过外层偏移+内层偏移的方式计算连续不重复的索引,无需手动构造索引向量:外层每遍历1个typ值,索引偏移量为内层freq的总长度,再叠加当前内层循环的位置即可得到唯一索引。
优化后的代码如下:
# 配置参数 freq <- c('4', '8', '13', '38','N_4','N_8','N_13','N_38') typ <- c('PE','QS') # 预分配列表空间,提升运行性能 dataintra <- vector("list", length = length(typ) * length(freq)) # 可选:给列表元素设置命名,方便后续调用 names(dataintra) <- paste0(rep(typ, each = length(freq)), "_", freq) for (j in seq_along(typ)){ for (k in seq_along(freq)){ # 计算唯一连续索引 idx <- (j - 1) * length(freq) + k dataintra[[idx]] <- read.csv( sprintf('M1_PredErr_Results_%s_%s.csv', typ[j], freq[k]), sep = ',', header = TRUE ) } }
说明:使用seq_along()替代硬编码的1:2、1:8,后续如果修改freq或typ的参数长度,无需调整循环边界,代码健壮性更高。
内容的提问来源于stack exchange,提问作者Unai Vicente
相关产品推荐
相关产品推荐

