R循环中tryCatch跳过缺失文件,无法记录缺失i/j组合问题排查
问题原因与解决方案
问题根源
你的代码里,tryCatch的error回调函数是独立的局部作用域,函数内部的missing_df是局部变量,和全局环境定义的missing_df不是同一个对象。所以回调里执行的bind_rows操作只在函数内部生效,不会同步到全局的missing_df中。
解决方法
在回调函数里使用全局赋值运算符<<-,强制修改全局环境中的missing_df:
修改后的完整代码:
library(readxl) library(tidyverse) df <- data.frame() # 存储导入数据的空数据框 missing_df <- data.frame(i = numeric(), j = numeric()) # 存储缺失记录的空数据框 for (i in 1:4){ for (j in 1:3) { tryCatch({ out <- read_xlsx(paste0("C:\\test\\File_", i, j, ".xlsx")) df <- bind_rows(df, out) }, error = function(e) { message(paste0("The following do not exist: i = ", i, ", j = ", j)) # 使用<<-赋值给全局环境的missing_df missing_df <<- bind_rows(missing_df, data.frame(i = i, j = j)) } ) } }
补充说明
<<-会在当前作用域的上层环境中寻找目标变量,直到找到全局环境为止,这样就能确保修改的是最初定义的missing_df数据框。
内容的提问来源于stack exchange,提问作者Chris
相关产品推荐
相关产品推荐

