为什么R语言中load函数在lapply中不生效但在for循环中正常运行?
问题根源
load() 函数的默认行为是将rda文件中存储的对象直接写入当前工作环境,它的返回值仅为被加载对象的名称字符串,而非对象本身。因此你用lapply包裹load时,最终拿到的结果只能是每次加载返回的"val"字符串,无法直接得到对象存储的数值。
另外你使用的for循环逻辑也存在隐藏问题:运行结束后全局环境只会保留最后一次加载的val(也就是610的向量),前一次加载的15的向量会被同名变量直接覆盖,无法同时获取两个文件的内容。
解决方案
方案1:无需修改存文件逻辑,适配现有rda文件
在每次加载时创建临时独立环境存储读取到的对象,再从环境中提取目标值存入列表:
res <- lapply(files, function(x) { # 新建临时环境,避免变量名冲突 temp_env <- new.env() # 将文件内容加载到临时环境而非全局环境 load(x, envir = temp_env) # 提取环境中的第一个对象(此处每个rda仅存val一个对象,直接提取即可) temp_env[[ls(temp_env)[1]]] })
运行后res就是按文件顺序存储两个数值向量的列表,符合你的预期。
方案2:改用更适配单对象批量读取的序列化方法
如果可以修改存储文件的逻辑,推荐用saveRDS存储单对象,搭配readRDS读取,该函数会直接返回对象本身,不需要额外处理环境变量:
# 存储文件阶段 val <- c(1:5) saveRDS(val, file='test1.rds') val <- c(6:10) saveRDS(val, file='test2.rds') # 批量读取阶段 files <- paste0('test', 1:2, '.rds') res <- lapply(files, readRDS)
内容的提问来源于stack exchange,提问作者Xiang
相关产品推荐
相关产品推荐

