Использование бинарного оператора в lazyeval вызове с Rlang

Допустим, я хочу добавить 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))

Любая помощь будет оценена. Благодарю.

1 ответ

Решение

Вы можете просто использовать

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

Обратите внимание на круглые скобки вокруг части bang-bang. Это необходимо только потому, что вы, вероятно, используете более старую версию rlang. В более старых версиях (<0,2) !! имеет очень низкий приоритет, поэтому добавление происходит перед расширением. Начиная с Rlang 0,2 !! получил другой приоритет оператора и работает больше, чем вы могли ожидать.

Конечно, если вы применяете одно и то же преобразование к группе столбцов, вы можете использовать mutate_at, mutate_all, или же mutate_if версии, которые также позволяют конкретизировать преобразования с помощью синтаксиса формулы.

mutate_if(data, is.numeric, ~.x+1)
mutate_all(data, ~.x+1)
mutate_at(data, var, ~.x+1)
Другие вопросы по тегам