Получить элементы из произвольного вложенного списка - PullRequest
0 голосов
/ 01 октября 2018

У меня есть такой вложенный список:

nested_list = list(children = list(CV = "hello", 
                                   children = list(CV = "out", 
                                                   children = list(CV = "there", 
                                                                   TE = "blaa")), 
                                   TE = "hello",
                                   children = list(CV = "tom", 
                                                   TE = "lisa", 
                                                   children = list(TE = "bob"))), 
                   children = list(CV = "sam", 
                                   children = list(CV = "out", 
                                                   children = list(CV = "there", 
                                                                   TE = "blaa", 
                                                                   other = "other element"))))

, и мне нужно извлечь все элементы с именами "CV" или "TE".Также могут быть элементы с другими именами, такими как CV или TE.

Элементы с именами "TE" или "CV" могут быть самими списками, поэтому мне нужно извлечь списки.Вот некоторые входные данные со списками в качестве элементов, которые необходимо извлечь.

nested_list2 = list(children = list(CV = "hello", 
                                   children = list(CV = list(subject = "sub", value = list(key = "1", var = "45")), 
                                                   children = list(CV = "there", 
                                                                   TE = list(subject = "sub2")))))

Проблема заключается в неизвестном уровне глубины вложенных списков.поэтому мне нужна функция, которую я могу использовать в любом вложенном списке.

Это ожидаемый вывод для nested_list:

exp_output = list(CV = "hello", 
                  CV = "out", 
                  CV = "there", 
                  TE = "blaa", 
                  TE = "hello", 
                  CV = "tom", 
                  TE = "lisa", 
                  TE = "bob", 
                  CV = "sam",
                  CV = "out", 
                  CV = "there", 
                  TE = "blaa")

, и это будет ожидаемый вывод nested_list2:

exp_output2 = list(CV = list("hello"),
                   CV = list(subject = "sub", value = list(key = "1", var = "45")),
                   CV = list("there"),
                   TE = list(subject = "sub2"))

Я знаю, что элементы списка не будутесть уникальные имена, но мне нужна эта структура.Есть ли такая функция?Я ничего не нашел.

Любая помощь приветствуется.

1 Ответ

0 голосов
/ 01 октября 2018

Вы можете использовать рекурсивную функцию, которая добавляет список:

res <- list()
fun <- function(x, nms){
  if(any(names(x) %in% nms)){
    res <<- c(res,x[names(x) %in% nms])
    x <- x[!names(x) %in% nms]
  }
  if (is.list(x)) lapply(x,fun,nms)
}
fun(nested_list2, c("CV","TE"))

res <- list()
fun(nested_list, c("CV","TE"))
str(res)
# List of 12
# $ CV: chr "hello"
# $ TE: chr "hello"
# $ CV: chr "out"
# $ CV: chr "there"
# $ TE: chr "blaa"
# $ CV: chr "tom"
# $ TE: chr "lisa"
# $ TE: chr "bob"
# $ CV: chr "sam"
# $ CV: chr "out"
# $ CV: chr "there"
# $ TE: chr "blaa"

res <- list()
fun(nested_list2, c("CV","TE"))
str(res)
# List of 4
# $ CV: chr "hello"
# $ CV:List of 2
# ..$ subject: chr "sub"
# ..$ value  :List of 2
# .. ..$ key: chr "1"
# .. ..$ var: chr "45"
# $ CV: chr "there"
# $ TE:List of 1
# ..$ subject: chr "sub2"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...