在某些成员不存在的嵌套列表中找到第一位

Finding first place in nested list where some member doesn't exist

假设我有一个像

这样的列表
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' )
          )
         )

请注意 bearsnake 没有 occupation 元素。我想在这个嵌套级别(深度 2)和 return 没有 occupation 成员的第一个(或任何)成员上遍历我的列表。所以在这种情况下,适合我的函数的 return 值将是

li$mammals$bear

li$amphibians$snake

总而言之,我的问题是如何遍历嵌套深度级别和return基于列表中条件的元素?


我一点也不精通 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)))

如果我的意图不仅仅是 return TRUEFALSE 而是第一个错误,我很难弄清楚如何最轻松地执行遍历不过,条件如上所述。

请注意,这是一个玩具示例 - 我实际上是在尝试在数据库输入之前验证一些用户输入数据,我认为这非常能代表我的问题。

我们可以用 lapply 循环遍历嵌套的 list,根据逻辑条件对元素进行子集 %in%Filter list 的 NULL 元素

Filter(length, lapply(li, function(x) Filter(length, 
       lapply(x, function(nm) nm[!"occupation" %in% names(nm)]))))