當前位置: 首頁>>代碼示例 >>用法及示例精選 >>正文


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。非經特殊聲明,原始代碼版權歸原作者所有,本譯文未經允許或授權,請勿轉載或複製。