R语言for循环调用load.Rdata后执行rm提示对象未找到原因求解
问题原因
触发警告的核心原因有两类:
- 函数环境不匹配:
miceadds::load.Rdata的envir参数默认值为.GlobalEnv(全局环境),在函数内调用该函数时,RData解析出的dta00对象会被加载到全局环境,而非当前函数的局部运行环境。而rm(dta00)默认仅在当前函数的局部环境中查找待删除对象,局部环境从未生成过dta00,自然会报对象未找到的警告。 - 文件加载失败:如果传入的文件名对应的RData文件不存在、路径错误或文件损坏,会导致加载流程完全失败,也不会生成任何
dta00对象,执行删除时同样会触发警告。
修复方案
方案1:指定加载环境为当前函数局部环境(最常用)
调用load.Rdata时手动指定加载到当前函数环境,后续rm可直接在局部环境找到对应对象:
tmp_fun = function(list_dtaname){ for (ii in 1:length(list_dtaname)) { filename0 = paste0(list_dtaname[ii],'.RData') # 明确指定加载到当前函数的局部环境 miceadds::load.Rdata(filename0, "dta00", envir = environment()) rm(dta00) } }
方案2:删除时指定查找全局环境
如果确实需要把数据加载到全局环境,删除时同步指定查找全局环境即可:
tmp_fun = function(list_dtaname){ for (ii in 1:length(list_dtaname)) { filename0 = paste0(list_dtaname[ii],'.RData') miceadds::load.Rdata(filename0, "dta00") # 指定从全局环境删除对象 rm(dta00, envir = .GlobalEnv) } }
方案3:增加文件存在性和对象存在性判断
如果不确定传入的文件路径是否合法,可增加校验逻辑避免不必要的警告:
tmp_fun = function(list_dtaname){ for (ii in 1:length(list_dtaname)) { filename0 = paste0(list_dtaname[ii],'.RData') # 先判断文件是否存在 if (!file.exists(filename0)) { warning(paste0("文件不存在:", filename0)) next } miceadds::load.Rdata(filename0, "dta00", envir = environment()) # 判断对象存在后再执行删除 if (exists("dta00")) { rm(dta00) } } }
内容的提问来源于stack exchange,提问作者John legend2
相关产品推荐
相关产品推荐

