Использование бинарного оператора в 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)