这些函数是 map()
的变体,可同时迭代多个参数。它们是并行的,因为每个输入都与其他输入并行处理,而不是多核计算的意义上,即它们与 base::pmax()
和 base::pmin()
共享相同的 "parallel" 概念。
用法
pmap(.l, .f, ..., .progress = FALSE)
pmap_lgl(.l, .f, ..., .progress = FALSE)
pmap_int(.l, .f, ..., .progress = FALSE)
pmap_dbl(.l, .f, ..., .progress = FALSE)
pmap_chr(.l, .f, ..., .progress = FALSE)
pmap_vec(.l, .f, ..., .ptype = NULL, .progress = FALSE)
pwalk(.l, .f, ..., .progress = FALSE)
参数
- .l
-
向量列表。
.l
的长度决定了调用.f
时使用的参数数量。如果未命名,参数将按位置提供;如果命名,则按名称提供。长度为1的向量将被回收到任意长度;所有其他元素必须具有相同的长度。
数据帧是
.l
的一个重要特例。它将导致每行调用一次.f
。 - .f
-
一个函数,通过以下方式之一指定:
-
一个命名函数。
-
匿名函数,例如
\(x, y, z) x + y / z
或function(x, y, z) x + y / z
-
一个公式,例如
~ ..1 + ..2 / ..3
。不建议使用此语法,因为您只能按位置引用参数。
-
- ...
-
传递给映射函数的附加参数。
我们现在通常建议不要使用
...
将附加(常量)参数传递给.f
。相反,使用简写匿名函数:# Instead of x |> map(f, 1, 2, collapse = ",") # do: x |> map(\(x) f(x, 1, 2, collapse = ","))
这使得更容易理解哪些参数属于哪个函数,并且往往会产生更好的错误消息。
- .progress
-
是否显示进度条。使用
TRUE
打开基本进度条,使用字符串为其命名,或参阅progress_bars 了解更多详细信息。 - .ptype
-
如果是
NULL
,默认情况下,输出类型是结果元素的公共类型。否则,提供 "prototype" 给出所需的输出类型。
值
输出长度由输入的长度决定。输出名称由输入名称确定。输出类型由后缀确定:
-
无后缀:列表;
.f()
可以返回任何内容。 -
_lgl()
、_int()
、_dbl()
、_chr()
分别返回逻辑向量、整数向量、双精度向量或字符向量;.f()
必须返回长度为 1 的兼容原子向量。 -
_vec()
返回原子或 S3 向量,与.f
返回的类型相同。.f
可以返回几乎任何类型的向量,只要其长度为 1。 -
walk()
返回输入.x
(不可见)。这使得它很容易在管道中使用。.f()
的返回值被忽略。
.f
引发的任何错误都将包含在类 purrr_error_indexed 的错误中。
例子
x <- list(1, 1, 1)
y <- list(10, 20, 30)
z <- list(100, 200, 300)
pmap(list(x, y, z), sum)
#> [[1]]
#> [1] 111
#>
#> [[2]]
#> [1] 221
#>
#> [[3]]
#> [1] 331
#>
# Matching arguments by position
pmap(list(x, y, z), function(first, second, third) (first + third) * second)
#> [[1]]
#> [1] 1010
#>
#> [[2]]
#> [1] 4020
#>
#> [[3]]
#> [1] 9030
#>
# Matching arguments by name
l <- list(a = x, b = y, c = z)
pmap(l, function(c, b, a) (a + c) * b)
#> [[1]]
#> [1] 1010
#>
#> [[2]]
#> [1] 4020
#>
#> [[3]]
#> [1] 9030
#>
# Vectorizing a function over multiple arguments
df <- data.frame(
x = c("apple", "banana", "cherry"),
pattern = c("p", "n", "h"),
replacement = c("P", "N", "H"),
stringsAsFactors = FALSE
)
pmap(df, gsub)
#> [[1]]
#> [1] "aPPle"
#>
#> [[2]]
#> [1] "baNaNa"
#>
#> [[3]]
#> [1] "cHerry"
#>
pmap_chr(df, gsub)
#> [1] "aPPle" "baNaNa" "cHerry"
# Use `...` to absorb unused components of input list .l
df <- data.frame(
x = 1:3,
y = 10:12,
z = letters[1:3]
)
plus <- function(x, y) x + y
if (FALSE) {
# this won't work
pmap(df, plus)
}
# but this will
plus2 <- function(x, y, ...) x + y
pmap_dbl(df, plus2)
#> [1] 11 13 15
# The "p" for "parallel" in pmap() is the same as in base::pmin()
# and base::pmax()
df <- data.frame(
x = c(1, 2, 5),
y = c(5, 4, 8)
)
# all produce the same result
pmin(df$x, df$y)
#> [1] 1 2 5
map2_dbl(df$x, df$y, min)
#> [1] 1 2 5
pmap_dbl(df, min)
#> [1] 1 2 5
相关用法
- R purrr pluck 安全地获取或设置嵌套数据结构深处的元素
- R purrr possibly 包装函数以返回值而不是错误
- R purrr pluck_depth 计算向量的深度
- R purrr partial 部分应用函数,填充一些参数
- R purrr accumulate 累积向量缩减的中间结果
- R purrr imap 将函数应用于向量的每个元素及其索引
- R purrr list_transpose 转置列表
- R purrr as_vector 将列表强制转换为向量
- R purrr map_if 有条件地将函数应用于向量的每个元素
- R purrr map2 映射两个输入
- R purrr array-coercion 强制数组列出
- R purrr auto_browse 包装一个函数,以便在出错时自动 browser()
- R purrr insistently 将函数转换为等待,然后在错误后重试
- R purrr map_depth 在给定深度映射/修改元素
- R purrr list_simplify 将列表简化为原子或 S3 向量
- R purrr rerun 多次重新运行表达式
- R purrr quietly 包装一个函数来捕获副作用
- R purrr list_flatten 压平列表
- R purrr head_while 查找全部满足谓词的头/尾。
- R purrr rbernoulli 从伯努利分布生成随机样本
- R purrr rate-helpers 创建延迟率设置
- R purrr keep_at 根据元素的名称/位置保留/丢弃元素
- R purrr keep 根据元素的值保留/丢弃元素
- R purrr transpose 转置列表。
- R purrr flatten 将列表的列表展平为简单的向量
注:本文由纯净天空筛选整理自Hadley Wickham等大神的英文原创作品 Map over multiple input simultaneously (in "parallel")。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。