R: Find object by name in deeply nested list
Here's a function that will return the first match if found
find_name <- function(haystack, needle) {
if (hasName(haystack, needle)) {
haystack[[needle]]
} else if (is.list(haystack)) {
for (obj in haystack) {
ret <- Recall(obj, needle)
if (!is.null(ret)) return(ret)
}
} else {
NULL
}
}
find_name(my_list, "XY01")
We avoid lapply
so the loop can break early if found.
The list pruning is really a separate issue. Better to attack that with a different function. This should work
list_prune <- function(list, depth=1) {
if (!is.list(list)) return(list)
if (depth>1) {
lapply(list, list_prune, depth = depth-1)
} else {
Filter(function(x) !is.list(x), list)
}
}
Then you could do
list_prune(find_name(my_list, "XY01"), 1)
or with pipes
find_name(my_list, "XY01") %>% list_prune(1)