我很好奇为什么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创建。
答案 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
在这里不起作用) 。