Как разрешить рекурсивной функции проверять ранее обработанные строки - PullRequest
0 голосов
/ 28 февраля 2019

У меня есть рекурсивная функция, которая ищет строку и извлекает фрейм данных на основе этой строки.Иногда я попадаю в циклы infinte, поэтому я хотел бы сохранить список всех строк, которые уже были проверены.Как я могу это сделать?Вот функция.Я хочу сохранить все строки с именем 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")))
        }
    })
  }

1 Ответ

0 голосов
/ 28 февраля 2019

Попробуйте следующее, который инициализирует пустой вектор и просто добавляет символьное представление 'elem' в вектор на каждой итерации.Вектор сохраняется в среде вызывающей функции, поэтому оператор «<< -» используется для записи в него из среды неявной функции, установленной в lapply ().Теоретически, когда все возможные имена для поиска встречаются, функция в конечном итоге возвращает NULL и передает результат lapply вверх по вызывающей цепочке. </p>

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()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...