Попробуйте следующее, который инициализирует пустой вектор и просто добавляет символьное представление '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()