当前位置: 首页>>代码示例 >>用法及示例精选 >>正文


R purrr modify_tree 递归修改列表


modify_tree() 允许您递归地修改列表,提供修改每个叶子或每个节点(或两者)的函数。

用法

modify_tree(
  x,
  ...,
  leaf = identity,
  is_node = NULL,
  pre = identity,
  post = identity
)

参数

x

一个列表。

...

保留以供将来使用。必须为空

leaf

应用于每个叶子的函数。

is_node

一个谓词函数,用于确定元素是节点(通过返回 TRUE )还是叶(通过返回 FALSE )。默认值 NULL 使用 vctrs::vec_is_list() 将简单列表视为节点,将其他所有内容(包括 DataFrame 和线性模型等更丰富的对象)视为叶子。要递归到列表上构建的所有对象,请使用 is.list()

pre, post

应用于每个节点的函数。 pre 应用在"down" 路径上,即在使用 leaf 变换叶之前,而 post 应用在"up" 路径上,即在叶变换之后。

也可以看看

其他修改变体:map_depth()modify()

例子

x <- list(list(a = 2:1, c = list(b1 = 2), b = list(c2 = 3, c1 = 4)))
x |> str()
#> List of 1
#>  $ :List of 3
#>   ..$ a: int [1:2] 2 1
#>   ..$ c:List of 1
#>   .. ..$ b1: num 2
#>   ..$ b:List of 2
#>   .. ..$ c2: num 3
#>   .. ..$ c1: num 4

# Transform each leaf
x |> modify_tree(leaf = \(x) x + 100) |>  str()
#> List of 1
#>  $ :List of 3
#>   ..$ a: num [1:2] 102 101
#>   ..$ c:List of 1
#>   .. ..$ b1: num 102
#>   ..$ b:List of 2
#>   .. ..$ c2: num 103
#>   .. ..$ c1: num 104

# Recursively sort the nodes
sort_named <- function(x) {
  nms <- names(x)
  if (!is.null(nms)) {
    x[order(nms)]
  } else {
    x
   }
}
x |> modify_tree(post = sort_named) |> str()
#> List of 1
#>  $ :List of 3
#>   ..$ a: int [1:2] 2 1
#>   ..$ b:List of 2
#>   .. ..$ c1: num 4
#>   .. ..$ c2: num 3
#>   ..$ c:List of 1
#>   .. ..$ b1: num 2
源代码:R/modify-tree.R

相关用法


注:本文由纯净天空筛选整理自Hadley Wickham等大神的英文原创作品 Recursively modify a list。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。