我有一个从数据库中提取数据的递归函数。数据库很大,递归需要一段时间,最终会以错误结束,因为我已经超出了堆栈。我正在尝试调试函数,所以我想限制递归,这样我就可以在堆栈错误发生之前查看结果。
下面是函数。如何对其设置递归限制?(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
}
})
}
发布于 2019-03-04 03:11:35
您可以将计数器传递给函数,它会更干净一些,比如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
}
})
}
https://stackoverflow.com/questions/54971861
复制相似问题