r - 如何允许递归函数检查先前处理的字符串
问题描述
我有一个递归函数,它查找一个字符串并根据该字符串获取一个数据帧。有时我会进入无限循环,所以我想保留一个已经检查过的所有字符串的列表。我怎样才能做到这一点?这是功能。我想存储所有调用的字符串elem
get_all_dfs_rec <- function(df, my_env) {
lapply(df$relatedIdEx, function(elem) {
next_df <- myGIConcepts(elem)
next_df_list<-list(next_df,my_env)
if (!is.na(next_df_list)) {
rm(list = elem, envir = my_env)
unlist(get_all_dfs_rec(next_df_list[[1]], my_env), FALSE)
} else {
list(setNames(df, c("col1", "col2")))
}
})
}
解决方案
试试下面的方法,它初始化一个空向量,并在每次迭代时简单地将 'elem' 的字符表示附加到向量中。该向量保存在调用函数的环境中,因此“<<-”运算符用于从 lapply() 中建立的隐含函数的环境中写入它。理论上,一旦遇到所有可能的查找名称,该函数最终将返回 NULL 并将 lapply 的结果向上传递到调用链。
library(tidyverse)
already_lookedup <- c()
get_all_dfs <- function(df) {
lapply(df[, 1], function(elem) {
print(paste("Looking for element", elem))
if (as.character(unlist(elem)) %in% already_lookedup) {
print(paste("Already looked up ",elem," and skipping!"))
return (NULL)
} else {
already_lookedup <<- c(already_lookedup,as.character(unlist(elem)))
}
# use mget because we can use ifnotfound despite we are requesting only one element
next_df <- mget(elem, env = .GlobalEnv, ifnotfound = NA)
if (!is.na(next_df)) {
unlist(get_all_dfs(next_df[[1]]), F)
} else {
list(setNames(df, c("col1", "col2")))
}
})
}
flatten_dfr(get_all_dfs(df1)) %>% unique()
推荐阅读
- vba - 运行时错误 91,对象变量或未设置块变量,lastrow
- reactjs - 反应元素内的变化值
- javascript - 用于 javascript 的 VSCode 智能感知不适用于 Canvas 元素
- html - HtmlUnit 点击一个 HtmlAnchor
- python - 带有 socks5 代理的 urllib.request?
- c++ - 我应该如何在 C++ 中动态分配字符串指针?
- c# - 什么可能导致我的 System.NullReferenceException:“对象引用未设置为对象的实例。”?
- reactjs - Prisma:查询子关系的最高效方式
- reactjs - 在使用 chrome.tabs.create() 创建的新选项卡中执行脚本
- swift - Swift 5 - 如何创建一个带有中心圆按钮的标签栏?| 菜鸟在这里