当前位置: 首页>>代码示例 >>用法及示例精选 >>正文


R purrr pmap 同时映射多个输入(“并行”)


这些函数是 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 / zfunction(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 的错误中。

也可以看看

其他Map变体: imap()lmap()map2()map_depth()map_if()map()modify()

例子

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/pmap.R

相关用法


注:本文由纯净天空筛选整理自Hadley Wickham等大神的英文原创作品 Map over multiple input simultaneously (in "parallel")。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。