R函数使用。和〜

时间:2018-07-16 13:02:02

标签: r purrr

我正在尝试学习在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 

1 个答案:

答案 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