При использовании tidyeval в dplyr :: summaryrize_at отсутствует 'аргумент "e2" без ошибки по умолчанию " - PullRequest
3 голосов
/ 12 марта 2019

Я пытаюсь перехватить 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 

Чего мне не хватает? Я использую dplyr v0.8.0.1, stringr v1.4 и rlang v0.3.1, работающие на R v3.5.3

1 Ответ

2 голосов
/ 12 марта 2019

Я думаю, это ошибка, но пока вы можете сделать

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(.))  

как обходной путь. Вы получаете предупреждение о мягкой амортизации, но вам не следует следовать этому совету, поскольку ошибка находится где-то в тщательной проверке вашей функции.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...