/ / Використання бінарного оператора в lazyeval call з rlang - r, dplyr, lazy-оцінка, rlang, standard-оцінка

Використання бінарного оператора в лазєвальному виклику з rlang-r, dplyr, lazy-evaluation, rlang, standard-evaluation

Скажімо, я хочу додати 1 до кожного значення стовпця за допомогою dplyr і стандартне оцінювання.

Я можу зробити :

library(dplyr)
data <- head(iris)
var <- "Sepal.Length"
mutate(data, !!rlang::sym(var) := !!quo(`+`(!!rlang::sym(var), 1)))

Але що робити, якщо я хотів би скористатися + як бінарний оператор, а не як функція? Я не можу зрозуміти, як писати + із символом у квасурі. У більшості своїх спроб я отримав помилку за спробу використання нечислового аргументу (наприклад, символу) з двійковим оператором +.

З застарілим mutate_ ви можете використовувати lazyeval::interp що дозволило вам зробити це легко:

mutate_(data, .dots = setNames(list(lazyeval::interp(~var + 1, var = as.symbol(var))), var))

Будь-яка допомога буде вдячна. Дякую.

Відповіді:

3 для відповіді № 1

Ви можете просто використовувати

mutate(data, !!rlang::sym(var) := (!!rlang::sym(var)) + 1)

Зверніть увагу на дужки навколо частини чубчика. Це необхідно лише тому, що ви, ймовірно, використовуєте старішу версію rlang. У старих версіях (<0,2) !! має дуже низький пріоритет, тому додавання відбувається перед розширенням. Починаючи з rlang 0,2 the !! має інший пріоритет оператора і працює більше, як ви могли очікувати.

Звичайно, якщо ви застосовуєте одне і те ж перетворення на купу стовпців, ви можете скористатися mutate_at, mutate_all, або mutate_if версії, які також дозволяють перетворенням бути специфічними з синтаксисом формули.

mutate_if(data, is.numeric, ~.x+1)
mutate_all(data, ~.x+1)
mutate_at(data, var, ~.x+1)