根据已完成的递归次数限制递归函数

时间:2019-03-03 17:50:03

标签: r lapply

我有一个递归函数,可以从数据库中提取数据。数据库很大,递归要花一些时间,最终由于我超出堆栈而导致错误。我正在尝试调试该函数,所以我想限制递归,以便可以在出现堆栈错误之前查看结果。

这是函数。如何设置递归限制? (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
    }
  })
}

1 个答案:

答案 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
    }
  })
}