R:在深层嵌套列表中按名称查找对象

舒适鹰

问题

我想这应该是一个常见的问题,但是我找不到解决方案:

让我们假设一个深度嵌套的列表,例如:

my_list <- list(
  "first_node" = list(
    "group_a" = list(
      "E001" = 1:5,
      "E002" = list(
        "F001" = 6:10,
        "F002" = 11:15
      )
    ),
    "group_b" = list(
      "XY01" = list(
        "Z1" = LETTERS[1:5],
        "Z2" = LETTERS[6:10],
        "Z3" = list(
          "ZZ1" = LETTERS[1],
          "ZZ2" = LETTERS[2],
          "ZZ3" = LETTERS[3]
        )
      ),
      "YZ" = LETTERS[11:15]
    ),
    "group_c" = list(
      "QQQQ" = list(
        "RRRR" = 200:300
      )
    )
  ),
  "second_node" = list(
    "group_d" = list(
      "L1" = 99:101,
      "L2" = 12
    )
  )
)

期望的输出

我想通过它们的名称检索元素,这些元素可能位于该列表的未知深度。重要的是,我只想要该特定元素,而是孩子,而不是父母。

例如,搜索my_list对于"XY01"应产生:

XY01 = list(
  "Z1" = LETTERS[1:5],
  "Z2" = LETTERS[6:10],
  "Z3" = list(
    "ZZ1" = LETTERS[1],
    "ZZ2" = LETTERS[2],
    "ZZ3" = LETTERS[3]
  )
)

> str(XY01)
List of 3
 $ Z1: chr [1:5] "A" "B" "C" "D" ...
 $ Z2: chr [1:5] "F" "G" "H" "I" ...
 $ Z3:List of 3
  ..$ ZZ1: chr "A"
  ..$ ZZ2: chr "B"
  ..$ ZZ3: chr "C"

以前的尝试

最初,我想用来rapply()完成这项工作,但似乎无法访问names()当前迭代。我的第二次尝试是编写自定义递归函数:

recursive_extract <- function(haystack, needle){

    lapply(names(haystack), function(x){
      if (needle %in% names(haystack[[x]])) {
        return(haystack[[needle]])
      } else {
        recursive_extract(haystack[[x]], needle)
      }
    }) %>% setNames(names(haystack))
}

...这似乎也是有问题的,因为lapply()即使NULL返回,它也总是会返回相同的对象,因此父级结构也随之而来。

我一直在寻找purrrrlist-packages的便捷功能,但似乎大多数都不支持递归(?)。

奖金挑战

提取所需的元素后,理想情况下,我希望选择要返回的子级别数。例如:desired_func(haystack, needle, get_depth = 1)对于前面的示例,将导致:

XY01 = list(
  "Z1" = LETTERS[1:5],
  "Z2" = LETTERS[6:10]
)

> str(XY01)
List of 2
 $ Z1: chr [1:5] "A" "B" "C" "D" ...
 $ Z2: chr [1:5] "F" "G" "H" "I" ...

非常感谢帮助!:)

弗里克先生

这是一个函数,如果找到,它将返回第一个匹配项

find_name <- function(haystack, needle) {
 if (hasName(haystack, needle)) {
   haystack[[needle]]
 } else if (is.list(haystack)) {
   for (obj in haystack) {
     ret <- Recall(obj, needle)
     if (!is.null(ret)) return(ret)
   }
 } else {
   NULL
 }
}

find_name(my_list, "XY01")

我们避免lapply这样做,如果发现环路,可以尽早中断。

列表修剪实际上是一个单独的问题。最好用其他功能进行攻击。这应该工作

list_prune <- function(list, depth=1) {
  if (!is.list(list)) return(list)
  if (depth>1) {
    lapply(list, list_prune, depth = depth-1)
  } else  {
    Filter(function(x) !is.list(x), list)
  }
}

那你可以做

list_prune(find_name(my_list, "XY01"), 1)

或用管道

find_name(my_list, "XY01") %>% list_prune(1)

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

按值在深层嵌套对象中查找对象

来自分类Dev

在NSMutableArray中按名称查找对象

来自分类Dev

从Java中的嵌套对象列表中按ID查找对象

来自分类Dev

如何在pyqt中按名称查找对象?

来自分类Dev

Qt:按属性在列表中查找对象

来自分类Dev

如何按属性在python列表中查找对象

来自分类Dev

在列表中查找对象

来自分类Dev

在列表中查找对象

来自分类Dev

从地图内的列表中查找对象

来自分类Dev

从地图内的列表中查找对象

来自分类Dev

根据嵌套对象的逻辑查找对象列表

来自分类Dev

在Java中按字段名称查找对象的值

来自分类Dev

如何使用lodash在嵌套的对象数组中查找对象?

来自分类Dev

在对象中按名称查找嵌套属性的最佳方法

来自分类Dev

从 plsql 中的对象列表中查找对象

来自分类Dev

Javascript:在树中深层查找对象,然后通过树返回对象及其路径

来自分类Dev

通过嵌套数组中的match属性查找对象

来自分类Dev

使用流在列表列表中查找对象

来自分类Dev

Java查找对象列表中不包含的对象

来自分类Dev

C# 使用对象字段在列表中查找对象

来自分类Dev

在数组Ramda中按ID查找对象

来自分类Dev

在Rails 4 App中按ID查找对象

来自分类Dev

在数组数组中按 id 查找对象的索引

来自分类Dev

使用其属性名称在javascript中查找对象的索引

来自分类Dev

从列表中查找对象数组中的值

来自分类Dev

在Python中查找对象内部列表的长度

来自分类Dev

在列表中查找对象并替换其值

来自分类Dev

从树或列表层次结构中查找对象

来自分类Dev

如何通过列表中的属性值获取/查找对象