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。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。