R语言writeData函数写入updated_origin相关数据至Excel时结果异常
问题分析:写入Excel时与updated_origin相关数据位置异常的原因
问题现象
- 写入与
updated_origin相关的数据(示例代码:writeData(wb,"sheet3",x = multiply,xy = c(c,r+2))时,结果异常:本应在第5行第3列的917636出现在第6行第3列,且第4列数值错误。 - 写入与
updated_origin无关的数据(示例代码:writeData(wb,"sheet3",x =column_sum,xy = c(c,r+2))时,结果符合预期。 - 最初怀疑
xy = c(c,r+2)参数问题,但调整后无改善。
相关代码
addWorksheet(wb,"sheet3") writeData(wb,"sheet3",x = filtered_triangle) saveWorkbook(wb, "testing.xlsx", overwrite = TRUE) origin <- read_excel("testing.xlsx","sheet2",skip = 1) origin[] <- lapply(origin,as.numeric) updated_origin <- read_excel("testing.xlsx","sheet3",skip = 1) updated_origin[] <- lapply(updated_origin,as.numeric) r <- 1 c <- 2 while(c <= ncol(origin)-1){ while(r <= nrow(origin)){ #column_sum <- sum(origin[,c],na.rm = TRUE) multiply <- read_excel("testing.xlsx","sheet3",skip = 1)[r,c-1] #column_divide <- sum(origin[,c-1],na.rm = TRUE)-multiply #cumulative <- column_sum*multiply/column_divide if(is.na(origin[r,c])){ writeData(wb,"sheet3",x = multiply,xy = c(c,r+2)) saveWorkbook(wb, "testing.xlsx", overwrite = TRUE) } r <- r+1 } c <- c+1 r <- 1 } saveWorkbook(wb, "testing.xlsx", overwrite = TRUE)
问题原因及修正建议
核心原因
频繁读写本地文件导致数据不同步
循环内每次写入后立即存盘,又立刻读取本地Excel文件获取multiply值。Excel文件的读写存在缓存机制,频繁的存读操作会导致读取到的不是最新写入的数据,进而让multiply取值错误,最终写入位置和数值异常。未利用内存中的数据对象,反而依赖文件读写
你已经将sheet3的数据读入updated_origin,但后续逻辑没有使用这个内存中的数据框,反而反复读取本地文件,既降低效率又容易引发数据不一致问题。行号计算与实际文件状态不匹配
写入时用r+2作为行号,但频繁修改文件后,sheet3的实际行结构可能发生变化,导致内存中r的计数和文件中的实际行号对应关系偏移,出现位置错误。
修正方案
直接操作内存数据,避免频繁读写文件:将
multiply的取值改为从内存中的updated_origin获取,替换:multiply <- read_excel("testing.xlsx","sheet3",skip = 1)[r,c-1]为:
multiply <- updated_origin[r,c-1]同时,每次修改
wb后,同步更新updated_origin,保证内存数据和工作簿一致。统一存盘时机:去掉循环内的
saveWorkbook(wb, "testing.xlsx", overwrite = TRUE),只在所有循环操作完成后执行一次存盘。校验行号偏移逻辑:确认
skip=1读取数据时的行号,和写入时r+2的偏移是否匹配,避免因表头跳过导致的行号计算错误。
内容的提问来源于stack exchange,提问作者orochi
相关产品推荐
相关产品推荐

