为什么purrr :: map不支持准引用?

时间:2019-01-31 21:46:05

标签: r tidyverse purrr rlang

我很好奇为什么purrr::map_*函数族尽管是tidyverse的一部分,但在评估映射函数之前不通过拼接取消引用dots来支持准引用吗?

library(tidyverse)
library(rlang)

set.seed(1)
dots <- quos(digits = 2L)

# this obviously won't work
purrr::map_chr(rnorm(5L), 
               ~ format(.x, !!!dots))
#> Error in !dots: invalid argument type

# I'm confused why this does not work
purrr::map_chr(rnorm(5L), 
               ~ format(.x, ...), 
               !!!dots)
#> Error in !dots: invalid argument type

# Finally, this works
eval_tidy(expr(
  purrr::map_chr(rnorm(5L), 
                 ~ format(.x, ...), 
                 !!!dots)
))
#> [1] "1.5"   "0.39"  "-0.62" "-2.2"  "1.1"

reprex package(v0.2.0)于2019-01-31创建。

1 个答案:

答案 0 :(得分:2)

我认为问题是format不支持整洁的点-您可以使用exec来强制某个函数能够使用它们:

library(tidyverse)
library(rlang)

set.seed(1)

nums <- rnorm(5L) #for some reason couldn't replicate your numbers
nums
#[1] -0.6264538  0.1836433 -0.8356286  1.5952808  0.3295078

dots <- exprs(digits = 2L)

map_chr(nums, ~exec(format, .x, !!!dots))
#[1] "-0.63" "0.18"  "-0.84" "1.6"   "0.33"

您还需要使用exprs而不是quos来捕获其他函数参数,以使其正常工作(老实说,不完全确定为什么quos在这里不起作用) 。