modify_tree()
允許您遞歸地修改列表,提供修改每個葉子或每個節點(或兩者)的函數。
參數
- x
-
一個列表。
- ...
-
保留以供將來使用。必須為空
- leaf
-
應用於每個葉子的函數。
- is_node
-
一個謂詞函數,用於確定元素是節點(通過返回
TRUE
)還是葉(通過返回FALSE
)。默認值NULL
使用vctrs::vec_is_list()
將簡單列表視為節點,將其他所有內容(包括 DataFrame 和線性模型等更豐富的對象)視為葉子。要遞歸到列表上構建的所有對象,請使用is.list()
。 - pre, post
-
應用於每個節點的函數。
pre
應用在"down" 路徑上,即在使用leaf
變換葉之前,而post
應用在"up" 路徑上,即在葉變換之後。
例子
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 purrr modify_in 修改拔取位置
- R purrr modify 有選擇地修改元素
- R purrr map_if 有條件地將函數應用於向量的每個元素
- R purrr map2 映射兩個輸入
- R purrr map_depth 在給定深度映射/修改元素
- R purrr map_dfr 返回數據幀的函數
- R purrr map 將函數應用於向量的每個元素
- R purrr accumulate 累積向量縮減的中間結果
- R purrr imap 將函數應用於向量的每個元素及其索引
- R purrr list_transpose 轉置列表
- R purrr as_vector 將列表強製轉換為向量
- R purrr array-coercion 強製數組列出
- R purrr auto_browse 包裝一個函數,以便在出錯時自動 browser()
- R purrr pluck 安全地獲取或設置嵌套數據結構深處的元素
- R purrr insistently 將函數轉換為等待,然後在錯誤後重試
- R purrr list_simplify 將列表簡化為原子或 S3 向量
- R purrr rerun 多次重新運行表達式
- R purrr quietly 包裝一個函數來捕獲副作用
- R purrr list_flatten 壓平列表
- R purrr pmap 同時映射多個輸入(“並行”)
- R purrr possibly 包裝函數以返回值而不是錯誤
- R purrr head_while 查找全部滿足謂詞的頭/尾。
- R purrr rbernoulli 從伯努利分布生成隨機樣本
- R purrr rate-helpers 創建延遲率設置
- R purrr keep_at 根據元素的名稱/位置保留/丟棄元素
注:本文由純淨天空篩選整理自Hadley Wickham等大神的英文原創作品 Recursively modify a list。非經特殊聲明,原始代碼版權歸原作者所有,本譯文未經允許或授權,請勿轉載或複製。