在某些成员不存在的嵌套列表中找到第一位
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' )
)
)
请注意 bear
和 snake
没有 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 TRUE
或 FALSE
而是第一个错误,我很难弄清楚如何最轻松地执行遍历不过,条件如上所述。
请注意,这是一个玩具示例 - 我实际上是在尝试在数据库输入之前验证一些用户输入数据,我认为这非常能代表我的问题。
我们可以用 lapply
循环遍历嵌套的 list
,根据逻辑条件对元素进行子集 %in%
,Filter
list
的 NULL 元素
Filter(length, lapply(li, function(x) Filter(length,
lapply(x, function(nm) nm[!"occupation" %in% names(nm)]))))
假设我有一个像
这样的列表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)和 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 TRUE
或 FALSE
而是第一个错误,我很难弄清楚如何最轻松地执行遍历不过,条件如上所述。
请注意,这是一个玩具示例 - 我实际上是在尝试在数据库输入之前验证一些用户输入数据,我认为这非常能代表我的问题。
我们可以用 lapply
循环遍历嵌套的 list
,根据逻辑条件对元素进行子集 %in%
,Filter
list
的 NULL 元素
Filter(length, lapply(li, function(x) Filter(length,
lapply(x, function(nm) nm[!"occupation" %in% names(nm)]))))