我有一个递归函数,可以从数据库中提取数据。数据库很大,递归要花一些时间,最终由于我超出堆栈而导致错误。我正在尝试调试该函数,所以我想限制递归,以便可以在出现堆栈错误之前查看结果。
这是函数。如何设置递归限制?
(df$relatedIdEx
只是数据框中的一个字符串,用作查找新数据框的字符串)。如果已经查找了字符串,则可以跳过-这是为了防止无限循环
get_all_dfs <- function(df) {
lapply(df$relatedIdEx, function(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)))
}
next_df <- myGIConcepts(elem)
#next_df_list<-list(next_df,my_env)
if (nrow(next_df)>1) {
get_all_dfs(next_df)
} else {
thelist<-df
}
})
}
答案 0 :(得分:1)
您可以将计数器传递给函数,该函数更简洁一些,例如get_all_dfs <- function(df,counter)
。但是您的问题意味着可以快速解决。计数器添加如下。请注意,您也可以根据需要将计数器放在哪里或在哪里打破,也可能将其移动到Lapply中。
counter <- 0
get_all_dfs <- function(df) {
counter <<- counter+1
if (counter > 100) return (NULL)
lapply(df$relatedIdEx, function(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)))
}
next_df <- myGIConcepts(elem)
#next_df_list<-list(next_df,my_env)
if (nrow(next_df)>1) {
get_all_dfs(next_df)
} else {
thelist<-df
}
})
}