Пользовательские функции: Как обратиться к другому столбцу, используя sym () и !! (bang bang) без использования funs () в dplyr 0.8.0? - PullRequest
1 голос
/ 06 марта 2019

В dplyr 0.8.0 оболочка funs() (используется в mutate_at() или summarise_at()) мягко осуждается.

Новый рекомендуемый синтаксис - использовать ~sum(.) вместо funs(sum(.))Это "старый стиль", который я бы использовал ранее.Моя цель состоит в том, чтобы перевести старый синтаксис в новый синтаксис, однако у меня возникли проблемы, когда вызов функции в funs() использует (!!sym()) для преобразования ввода символов для имени столбца всимвол, который может быть распознан внутри функции.

Вот пример того, как я мог бы написать функцию в старом стиле dplyr.

var - это строка символов, которая относится к имени столбца, а при funs() она умножается на Sepal.Length.

multiply_by <- function(var){
  iris %>%
    mutate_at("Sepal.Length",funs(.*!!sym(var)))
}
multiply_by("Sepal.Width") # This works

Мой вопрос заключается в том, что я не могу понять,как перевести это в новый синтаксис ~, не обнаружив ошибки.Если я запускаю следующее, это вызывает ошибку «неверный тип аргумента»:

multiply_by2 <- function(var){
  iris %>%
    mutate_at("Sepal.Length",~.*!!sym(var))
}
multiply_by2("Sepal.Width")
# Error in !sym(var) : invalid argument type 

Может кто-нибудь помочь?В настоящее время я могу обойтись с помощью funs(), но, поскольку он мягко осуждается, я хотел бы перенести мой код в стабильный формат, если / когда он станет полностью устарелым.Спасибо!

1 Ответ

1 голос
/ 06 марта 2019

Один из вариантов, упомянутых в выпусках , будет использовать .data

multiply_by2 <- function(var){
 iris %>% 
       mutate_at("Sepal.Length", list( ~ .* .data[[var]]))

}

multiply_by2("Sepal.Width")
...