Ограничить рекурсивную функцию по количеству выполненных рекурсий - PullRequest
0 голосов
/ 03 марта 2019

У меня есть рекурсивная функция, которая извлекает данные из базы данных.База данных огромна, и рекурсия занимает некоторое время и в конечном итоге заканчивается ошибкой, поскольку я превысил стек.Я пытаюсь отладить функцию, поэтому я хотел бы ограничить рекурсию, чтобы я мог посмотреть на результат до того, как произойдет ошибка стека.

Вот эта функция.Как я могу наложить ограничение рекурсии на это?(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 голосов
/ 03 марта 2019

Вы можете передать счетчик в функцию, которая немного более чиста, например, get_all_dfs <- function(df,counter).Но ваш вопрос подразумевает быстрое решение.Счетчик добавляется следующим образом.Обратите внимание, что вы также можете перемещать его в пределах лапы, в зависимости от того, где вы хотите разместить счетчик или где сломать.

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
    }
  })
}
...