/ / Usando operador binário na chamada lazyeval com rlang - r, dplyr, avaliação lenta, rlang, avaliação padrão

Usando operador binário em chamada lazyeval com rlang - r, dplyr, avaliação lenta, rlang, avaliação padrão

Vamos dizer que eu quero adicionar 1 a cada valor de uma coluna usando dplyr e avaliação padrão.

Eu posso fazer :

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

Mas e se eu quiser usar + como operador binário e não como função? Eu não consigo descobrir como escrever o + com um símbolo em um quosure. Na maioria das minhas tentativas, recebi um erro ao tentar usar um argumento não numérico (o símbolo, por exemplo) com o operador binário +.

Com o obsoleto mutate_ você pode usar lazyeval::interp o que permitiu que você fizesse isso facilmente:

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

Qualquer ajuda seria apreciada. Obrigado.

Respostas:

3 para resposta № 1

Você pode simplesmente usar

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

Observe os parênteses ao redor da parte bang-bang. Isso é necessário apenas porque você provavelmente está usando uma versão mais antiga do rlang. Nas versões mais antigas (<0,2) !! tem uma precedência muito baixa, então a adição acontece antes da expansão. Começando com rlang 0.2 o !! foi dada uma precedência de operador diferente e funciona mais como você poderia esperar.

Claro, se você está aplicando a mesma transformação em um monte de colunas, você pode querer usar o mutate_at, mutate_allou mutate_if versões, que também permitem que as transformações sejam específicas com a sintaxe da fórmula.

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