За кулисами map()
вызывает as_mapper () . Мы можем сделать это вручную, чтобы увидеть, что происходит:
purrr::as_mapper( ~ f(b = .x, a = 1) )
# <lambda>
# function (..., .x = ..1, .y = ..2, . = ..1)
# f(b = .x, a = 1) <----
# attr(,"class")
# [1] "rlang_lambda_function" "function"
purrr::as_mapper( ~ f(b = .x), a=1 )
# <lambda>
# function (..., .x = ..1, .y = ..2, . = ..1)
# f(b = .x) <----
# attr(,"class")
# [1] "rlang_lambda_function" "function"
Я выделил важное различие с помощью <---
. Обратите внимание, что во втором случае создаваемая лямбда-функция не включает ваш дополнительный параметр a=1
, что приводит к наблюдаемой вами ошибке.
Чтобы ответить на ваш комментарий, a=1
на самом деле передается лямбда-функции. Ваша лямбда-функция просто ничего с ней не делает. Чтобы правильно включить a
, определение лямбда-функции должно обрабатывать ...
точек:
g <- function(a, b, ...) {a + b} # ... are needed to catch all extra
# arguments from as_mapper
purrr::as_mapper( .f = ~ g(b=.x, ...) )
# <lambda>
# function (..., .x = ..1, .y = ..2, . = ..1)
# g(b = .x, ...) <-- dots are now forwarded to g()
# attr(,"class")
# [1] "rlang_lambda_function" "function"
purrr::map(1:3, .f = ~ g(b=.x, ...), a=1 ) # a now properly gets passed to g
# [[1]]
# [1] 2
#
# [[2]]
# [1] 3
#
# [[3]]
# [1] 4