如何在函数中保留对象

How do I retain an object within function

提问人:NornData 提问时间:11/9/2023 更新时间:11/9/2023 访问量:14

问:

我正在尝试创建一个函数,该函数创建一个对象,然后循环遍历并将所有内容绑定在一起。我发现的错误是:

在 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)
}
}
循环 tidyverse

评论


答:

0赞 uke 11/9/2023 #1

在你的代码中,我看到了很多东西。

  1. rm(long)循环内部for

long在循环的第一次迭代中被删除,在下一次迭代中,您会收到一条错误消息。您应该在函数结束时将循环放在循环之外。但实际上,您不需要删除在函数中创建的变量。因为它们不是在全局环境中创建的,而是在只有函数才能“看到”的环境中创建的。rm(long)

  1. Final未存储

我假设是一个旨在存储和返回循环结果的对象。Finalfor

Final <- bind_rows(long, wave_data)

正在重写 Final,每次迭代都以 + 当前 的组合 .在循环结束时,将仅包含最后一次迭代的结果,其他所有内容都被覆盖。关于如何在循环中存储结果,有许多答案。longwave_dataFinalfor

  1. 您的函数不返回任何内容

您可能希望您的函数返回一些数据帧。为了实现这一点,您可以查找如何使函数返回某些内容。