在第一种情况下,你的论点被传递给purrr::as_mapper
内部:
as_mapper(~f(., ...))
# function (..., .x = ..1, .y = ..2, . = ..1)
# f(., ...)
这意味着它的行为就像您编写的一样:
purrr::map_dbl(.x, function(..., .x = ..1, .y = ..2, . = ..1) f(., ...))
创建的函数有一个...
论点,(它总是如此,即使.f
没有它)。
The .x
, .y
, and .
参数实际上是从...
, as ..1
意思是“首先塞进...
", ..2
意思是“第二件事......”等等。
所以在你的第一种情况下.x
被通过...
并最终在.
以及。
col_summary3 <- function(.x, .f, ...){
.x <- purrr::keep(.x, is.numeric)
purrr::map_dbl(.x, ~{print(list(...));.f(., ...)})
}
col_summary3(mtcars,mean)
# [[1]]
# [1] 21.0 21.0 22.8 21.4 18.7 18.1 14.3 24.4 22.8 19.2 17.8 16.4 17.3 15.2 10.4 10.4
# [17] 14.7 32.4 30.4 33.9 21.5 15.5 15.2 13.3 19.2 27.3 26.0 30.4 15.8 19.7 15.0 21.4
# Error in mean.default(., ...) : 'trim' must be numeric of length one
.x
最终被送入第一个参数.f
到第二个通过.f(.,...)
,所以它最终出现在第二个参数中mean.default
, i.e. trim
,不喜欢它。
在你的第二个函数中情况并非如此,其中...
参数(在本例中未使用)顺利地从初始调用传递到.f
call.
回复“所以,在这种情况下,我不能使用 ~ 和 .,对吧?”
不能直接使用,因为有冲突...
。但是,您可以通过将其传递给.y
论证和使用purr::invoke
,但这对于下一个必须阅读它的人来说非常卑鄙:)。
col_summary4 <- function(.x, .f, ...){
.x <- purrr::keep(.x, is.numeric)
purrr::map_dbl(.x, ~ invoke(.f, .y, .), .y=list(...))
}
col_summary4(mtcars,mean)
# mpg cyl disp hp drat wt qsec vs am gear carb
# 20.090625 6.187500 230.721875 146.687500 3.596563 3.217250 17.848750 0.437500 0.406250 3.687500 2.812500
col_summary4(mtcars,mean, trim = 0.3)
# mpg cyl disp hp drat wt qsec vs am gear carb
# 19.1785714 6.4285714 214.5071429 136.2857143 3.5971429 3.2467857 17.7600000 0.3571429 0.2857143 3.5714286 2.6428571