在 dplyr::summarize_at 中使用 tidyeval 时出现 'argument "e2" is missing with no default' 错误

Getting 'argument "e2" is missing with no default' error when using tidyeval within dplyr::summarize_at

我正在尝试捕获跨一堆变量的 summarize_at 操作。这是一个愚蠢的例子:

library(dplyr)
library(stringr)

starwars %>%
  summarise_at(c("hair_color", "skin_color"), 
               ~ sum(if_else(str_detect(., "brown"), 1, birth_year), na.rm = TRUE))

# A tibble: 1 x 2
  hair_color skin_color
       <dbl>      <dbl>
1      2399.      3123.

假设我想将其捕获到一个函数中,我可以在其中将 birth_year 更改为其他内容。

myfun <- function(df, var) {
  df %>% 
    summarize_at(c("hair_color", "skin_color"), 
                 ~ sum(if_else(str_detect(., "brown"), 1, !! enquo(var)), na.rm = TRUE))
}

myfun(starwars, birth_year)

Error in is_quosure(e2) : argument "e2" is missing, with no default 

我错过了什么?我在 R v3.5.3

上使用 dplyr v0.8.0.1、stringr v1.4 和 rlang v0.3.1,运行

我猜这是一个错误,但同时你可以做

myfun <- function(df, var) {
  df %>% 
    summarize_at(c("hair_color", "skin_color"), 
                 funs(sum(if_else(str_detect(., "brown"), 1, !! enquo(var)), na.rm = TRUE)))
}
myfun(starwars, birth_year)
# A tibble: 1 x 2
#   hair_color skin_color
#        <dbl>      <dbl>
# 1      2399.      3123.
# Warning message:
# funs() is soft deprecated as of dplyr 0.8.0
# please use list() instead

# # Before:
# funs(name = f(.)

# # After: 
# list(name = ~f(.))  

作为解决方法。你会收到一个软折旧警告,但你不应该听从那里的建议,因为这个错误位于你的函数的某个地方。