根据对应的元素输出嵌套列表的名称

Output the names of a nested list based on their corresponding elements

如何输出与其元素对应的嵌套列表的名称?在这个例子中,我想输出 if ("cat") then "foo" , if("dog") then "bar".. 等。我想避免使用多个 if else statements ,因为可能有 100变量

parms <- list(
  "foo"    = list( id = "cat",    range = c(1,10)),
  "bar"    = list( id = "dog",    range = c(20,30)),
  "var"    = list( id = "mouse",  range = c(40,50))
)
                   

遵循@A5C1D2H2I1M1N2O1R2T1 评论中的建议:

names(grep("cat", sapply(parms, "[[", "id"), value = TRUE))
[1] "foo"

里面有什么:

  • sapply(parms, "[[", "id") 部分使用每个 id(猫、狗、...)和每个嵌套列表的名称(foo、bar、...)创建一个命名向量
  • grep returns 一个名为 vector 的元素,其重合元素及其名称。
  • names 部分从命名向量中提取名称(在本例中为 foo)。

您可以编写一个函数来动态处理您的请求。

get_names <- function(x, name, value) {
  names(Filter(function(p) all(p[[name]] == value), x))
}

get_names(parms, 'id', 'cat')
#[1] "foo"

get_names(parms, 'range', c(1, 10))
#[1] "foo"

get_names(parms, 'range', c(40, 50))
#[1] "var"

如果您想从函数中排除 name 依赖性。

get_names <- function(x, value) {
  names(Filter(function(p) any(unlist(p) == value), x))
}

get_names(parms, 'cat')
#[1] "foo"
get_names(parms, 40)
#[1] "var"

编辑

get_names <- function(x, name, value) {
  names(x)[sapply(x, `[[`, name) %in% value]  
}

get_names(parms, 'id', c('cat', 'dog'))
#[1] "foo" "bar"