R语言函数内对象'long'丢失报错,如何保留函数内对象?
问题:循环中对象丢失报错
In rm(long) : object 'long' not found 我写了一个R函数,想要创建对象后通过循环完成数据绑定,但运行时出现报错:
In rm(long) : object 'long' not found
发现对象long明明在函数开头创建好了,但循环执行过程中就丢失了,应该是我对R函数的运行机制理解不到位,求帮忙排查。我的代码如下:
Test <- FunctionName(Variables = c("Name")) FunctionName <- function(Variables) { var_list <- paste0("|._", c("Variables"), collapse = "") var_list <- paste0("Pim", var_list) long <- read_dta(file=paste0("a_dataname.dta")) %>% select(matches(var_list)) %>% rename_at(vars(starts_with("a_")), ~str_replace(., "a_", "")) %>% mutate(wave=1) for (wn in 2:3) { w1 <- paste0(letters[wn],"_") wave_data <- read_dta(paste0(w1, "dataname.dta")) %>% select(matches(var_list)) %>% rename_at(vars(starts_with(w1)), ~str_replace(.,w1, "")) %>% mutate(wave = wn) %>% print() Final <- bind_rows(long, wave_data) rm(long) } }
问题分析与修复
1. 报错直接原因
第一次循环(wn=2)时,你执行了rm(long)删除了这个对象;到第二次循环(wn=3)时,bind_rows(long, wave_data)里的long已经不存在了,所以触发报错。
2. 代码里的其他问题
var_list生成逻辑错误:c("Variables")是把字符串"Variables"放进向量,而不是引用函数的参数Variables,导致筛选变量的规则完全不对- 循环中每次都会覆盖
Final,最终只能保留最后一次循环的结果 - 函数没有返回值,调用后
Test会是NULL - 没必要每次循环都删除
long,属于多余操作
3. 修复后的代码
FunctionName <- function(Variables) { # 修复变量筛选规则:正确引用函数参数 var_list <- paste0("|._", Variables, collapse = "") var_list <- paste0("Pim", var_list) # 初始化最终数据集为第一波数据 Final <- read_dta(file = paste0("a_dataname.dta")) %>% select(matches(var_list)) %>% rename_at(vars(starts_with("a_")), ~str_replace(., "a_", "")) %>% mutate(wave = 1) # 循环处理后续波次数据 for (wn in 2:3) { w1 <- paste0(letters[wn], "_") wave_data <- read_dta(paste0(w1, "dataname.dta")) %>% select(matches(var_list)) %>% rename_at(vars(starts_with(w1)), ~str_replace(., w1, "")) %>% mutate(wave = wn) # 逐步绑定新数据到最终数据集 Final <- bind_rows(Final, wave_data) } # 返回最终结果 return(Final) } # 调用函数 Test <- FunctionName(Variables = c("Name"))
修复说明
- 修正了
var_list的生成逻辑,确保使用传入的参数Variables来构建变量筛选规则 - 用
Final作为初始数据集,循环中每次将新数据绑定到Final上,避免了对象丢失的问题 - 添加
return(Final)让函数返回处理后的数据集,调用后能得到有效结果 - 移除了不必要的
rm(long)操作,简化逻辑
内容的提问来源于stack exchange,提问作者NornData
相关产品推荐
相关产品推荐

