Example data:
library(purrr)
y <- "foo"
attr(y, "p") <- FALSE
z <- "bar"
attr(z, "p") <- TRUE
x <- list(list(y, z), list(y, y, y), list(z))
str(x)
# List of 3
# $ :List of 2
# ..$ : atomic [1:1] foo
# .. ..- attr(*, "p")= logi FALSE
# ..$ : atomic [1:1] bar
# .. ..- attr(*, "p")= logi TRUE
# $ :List of 3
# ..$ : atomic [1:1] foo
# .. ..- attr(*, "p")= logi FALSE
# ..$ : atomic [1:1] foo
# .. ..- attr(*, "p")= logi FALSE
# ..$ : atomic [1:1] foo
# .. ..- attr(*, "p")= logi FALSE
# $ :List of 1
# ..$ : atomic [1:1] bar
# .. ..- attr(*, "p")= logi TRUE
Your solution:
res_1 <- flatten(x) %>% keep(~attr(.x, "p"))
str(res_1)
# List of 2
# $ : atomic [1:1] bar
# ..- attr(*, "p")= logi TRUE
# $ : atomic [1:1] bar
# ..- attr(*, "p")= logi TRUE
Alternative solution that keeps the nested structure: to "keep at depth 2", we simply map (equivalent to "modify at depth 1") the keep function:
res_2 <- map(x, keep, attr, "p")
str(res_2)
# List of 3
# $ :List of 1
# ..$ : atomic [1:1] bar
# .. ..- attr(*, "p")= logi TRUE
# $ : list()
# $ :List of 1
# ..$ : atomic [1:1] bar
# .. ..- attr(*, "p")= logi TRUE