Поиск первого места во вложенном списке, где какой-либо член не существует
Предположим, у меня есть список как
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)]))))