lmap()
、 lmap_at()
和 lmap_if()
与 map()
、 map_at()
和 map_if()
类似,只不过它们不是映射到 .x[[i]]
,而是映射到 .x[i]
。
这有几个优点:
-
它使得使用专门使用列表的函数成为可能。
-
它允许
.f
访问封装列表的属性,如names()
。 -
它允许
.f
返回比它接收到的更大或更小的列表,从而更改输出的大小。
参数
- .x
-
列表或 DataFrame 。
- .f
-
一个函数,它接受一个长度为 1 的列表并返回一个列表(任意长度)。
- ...
-
传递给映射函数的附加参数。
我们现在通常建议不要使用
...
将附加(常量)参数传递给.f
。相反,使用简写匿名函数:# Instead of x |> map(f, 1, 2, collapse = ",") # do: x |> map(\(x) f(x, 1, 2, collapse = ","))
这使得更容易理解哪些参数属于哪个函数,并且往往会产生更好的错误消息。
- .p
-
单个谓词函数、说明此类谓词函数的公式或与
.x
长度相同的逻辑向量。或者,如果.x
的元素本身是对象列表,则为指示内部列表中逻辑元素名称的字符串。只有.p
计算结果为TRUE
的元素才会被修改。 - .else
-
应用于
.x
元素的函数,其中.p
返回FALSE
。 - .at
-
给出要选择的元素的逻辑向量、整数向量或字符向量。或者,函数接受名称向量,并返回要选择的元素的逻辑向量、整数向量或字符向量。
:如果安装了 tidyselect 软件包,则可以使用
vars()
和 tidyselect 帮助器来选择元素。
例子
set.seed(1014)
# Let's write a function that returns a larger list or an empty list
# depending on some condition. It also uses the input name to name the
# output
maybe_rep <- function(x) {
n <- rpois(1, 2)
set_names(rep_len(x, n), paste0(names(x), seq_len(n)))
}
# The output size varies each time we map f()
x <- list(a = 1:4, b = letters[5:7], c = 8:9, d = letters[10])
x |> lmap(maybe_rep) |> str()
#> List of 6
#> $ b1: chr [1:3] "e" "f" "g"
#> $ b2: chr [1:3] "e" "f" "g"
#> $ b3: chr [1:3] "e" "f" "g"
#> $ c1: int [1:2] 8 9
#> $ c2: int [1:2] 8 9
#> $ d1: chr "j"
# We can apply f() on a selected subset of x
x |> lmap_at(c("a", "d"), maybe_rep) |> str()
#> List of 4
#> $ b : chr [1:3] "e" "f" "g"
#> $ c : int [1:2] 8 9
#> $ d1: chr "j"
#> $ d2: chr "j"
# Or only where a condition is satisfied
x |> lmap_if(is.character, maybe_rep) |> str()
#> List of 5
#> $ a : int [1:4] 1 2 3 4
#> $ b1: chr [1:3] "e" "f" "g"
#> $ b2: chr [1:3] "e" "f" "g"
#> $ c : int [1:2] 8 9
#> $ d1: chr "j"
相关用法
- R purrr list_transpose 转置列表
- R purrr list_simplify 将列表简化为原子或 S3 向量
- R purrr list_flatten 压平列表
- R purrr list_c 将列表元素组合成单个数据结构
- R purrr list_assign 修改列表
- R purrr accumulate 累积向量缩减的中间结果
- R purrr imap 将函数应用于向量的每个元素及其索引
- R purrr as_vector 将列表强制转换为向量
- R purrr map_if 有条件地将函数应用于向量的每个元素
- R purrr map2 映射两个输入
- R purrr array-coercion 强制数组列出
- R purrr auto_browse 包装一个函数,以便在出错时自动 browser()
- R purrr pluck 安全地获取或设置嵌套数据结构深处的元素
- R purrr insistently 将函数转换为等待,然后在错误后重试
- R purrr map_depth 在给定深度映射/修改元素
- R purrr rerun 多次重新运行表达式
- R purrr quietly 包装一个函数来捕获副作用
- R purrr pmap 同时映射多个输入(“并行”)
- R purrr possibly 包装函数以返回值而不是错误
- R purrr head_while 查找全部满足谓词的头/尾。
- R purrr rbernoulli 从伯努利分布生成随机样本
- R purrr rate-helpers 创建延迟率设置
- R purrr keep_at 根据元素的名称/位置保留/丢弃元素
- R purrr keep 根据元素的值保留/丢弃元素
- R purrr transpose 转置列表。
注:本文由纯净天空筛选整理自Hadley Wickham等大神的英文原创作品 Apply a function to list-elements of a list。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。