Поиск первого места во вложенном списке, где какой-либо член не существует

Предположим, у меня есть список как

li <- list( 
        mammals = list( 
          giraffe = list(
            name       = 'giraffe',
            occupation = 'giraffing' ),
          bear = list(
            name       = 'bear' )
          ),
        amphibians = list(
          frog = list(
            name       = 'frog',
            occupation = 'frogging' ),
          snake = list(
            name       = 'snake' )
          )
         )

Заметить, что bear а также snake не имеет occupation элемент. Я хочу просмотреть свой список на этом уровне вложенности (глубина 2) и вернуть первый (или любой) член, который не имеет occupation член. Таким образом, в этом случае подходящие возвращаемые значения для моей функции будут

li$mammals$bear

или же

li$amphibians$snake

Подводя итог, мой вопрос заключается в том, как я могу перейти на вложенный уровень глубины и вернуть элемент, основанный на условии в списке, как этот?


Я совсем не разбираюсь в R, но я думаю, что я выяснил, как определить, есть ли у каждого элемента списка в моей глубине интереса (2) члены, которых я хочу гарантировать, рекурсивно существовать с чем-то вроде

required <- c('name', 'occupation')

has_elems <- function(ob, 
                      cur_d=0)
    ifelse(is.list(ob),
           all(sapply(ob, has_elems, cur_d=cur_d+1)),
           cur_d != 2 || all(required %in% names(ob)))

Мне трудно понять, как легче всего выполнить обход, если я не собираюсь просто возвращаться TRUE или же FALSE но вместо этого первое ложное условие, как описано выше, хотя.

Обратите внимание, что это игрушечный пример - на самом деле я пытаюсь проверить вводимые пользователем данные перед входом в базу данных, и я думаю, что это довольно типичный пример моей проблемы.

1 ответ

Решение

Мы можем перебрать вложенные list с lapplyподмножество элементов на основе логического условия %in%, Filter пустые элементы list

Filter(length, lapply(li, function(x) Filter(length, 
       lapply(x, function(nm) nm[!"occupation" %in% names(nm)]))))
Другие вопросы по тегам