提问人:NornData 提问时间:11/9/2023 更新时间:11/9/2023 访问量:14
如何在函数中保留对象
How do I retain an object within function
问:
我正在尝试创建一个函数,该函数创建一个对象,然后循环遍历并将所有内容绑定在一起。我发现的错误是:
在 rm(long) 中:未找到对象“long”
Long似乎在它的创建和循环之间不复存在。这可能是我对函数如何工作的了解的一个相当基本的差距。任何帮助将不胜感激。我使用的代码如下。
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)
}
}
答:
0赞
uke
11/9/2023
#1
在你的代码中,我看到了很多东西。
rm(long)
循环内部for
long
在循环的第一次迭代中被删除,在下一次迭代中,您会收到一条错误消息。您应该在函数结束时将循环放在循环之外。但实际上,您不需要删除在函数中创建的变量。因为它们不是在全局环境中创建的,而是在只有函数才能“看到”的环境中创建的。rm(long)
Final
未存储
我假设是一个旨在存储和返回循环结果的对象。Final
for
Final <- bind_rows(long, wave_data)
正在重写 Final,每次迭代都以 + 当前 的组合 .在循环结束时,将仅包含最后一次迭代的结果,其他所有内容都被覆盖。关于如何在循环中存储结果,有许多答案。long
wave_data
Final
for
- 您的函数不返回任何内容
您可能希望您的函数返回一些数据帧。为了实现这一点,您可以查找如何使函数返回某些内容。
评论