我正在尝试学习在R中使用~
和.
。
下面的代码是使用和不使用~
和.
编写的同一函数。我不明白第一个函数中发生了什么错误。
#FIRST FUNCTION
col_summary2 <- function(.x, .f, ...){
.x <- purrr::keep(.x, is.numeric)
purrr::map_dbl(.x, ~.f(., ...))
}
col_summary2(mtcars,mean) #Error in mean.default(., ...) : 'trim' must be numeric of length one
#SECOND FUNCTION
col_summary2 <- function(.x, .f, ...){
.x <- purrr::keep(.x, is.numeric)
purrr::map_dbl(.x, function(x) .f(x, ...))
}
col_summary2(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
答案 0 :(得分:3)
在第一种情况下,您的参数在内部传递给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
没有该参数也是如此)。
.x
,.y
和.
参数实际上是从...
中提取出来的,因为..1
的意思是“填入{{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
,不喜欢它。
在第二个函数中情况并非如此,trim
参数(在本例中未使用)从初始调用平稳地传递到了...
调用。
Re“所以,在这种情况下,我不能使用〜和。,对吗?”
您不能直接使用它,因为与.f
存在冲突。您可以通过将其传递给...
参数并使用.y
来解决它,但这对下一个必须阅读它的人来说非常重要:)。
purr::invoke