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

Любая помощь будет оценена по достоинству. Спасибо.


person Julien Navarre    schedule 06.03.2018    source источник


Ответы (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)
person MrFlick    schedule 06.03.2018
comment
Благодарю вас ! Я не знал, что упаковка !!quo() бесполезна, и действительно я использую rlang v0.1.6 - person Julien Navarre; 06.03.2018