Почему purrr :: map не поддерживает квазиквотацию? - PullRequest
0 голосов
/ 01 февраля 2019

Мне любопытно, почему семейство функций 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"

Создано в 2019-01-31 пакетом Представ (v0.2.0).

1 Ответ

0 голосов
/ 01 февраля 2019

Я думаю, что проблема в 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 здесь не работает).

...