/ / Usando el operador binario en llamada perezosa con rlang - r, dplyr, perez-evaluación, rlang, evaluación estándar

Uso del operador binario en llamada perezosa con rlang - r, dplyr, perez-evaluación, rlang, evaluación estándar

Digamos que quiero agregar 1 a cada valor de una columna usando dplyr y evaluacion estandar.

Puedo hacer :

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

Pero que tal si me gustaría usar + ¿Como operador binario y no como función? No puedo averiguar cómo escribir el + Con un símbolo en un quosure. En la mayoría de mis intentos obtuve un error al intentar usar un argumento no numérico (el símbolo, por ejemplo) con el operador binario +.

Con los desaprobados. mutate_ puedes usar lazyeval::interp lo que te permitió hacerlo fácilmente:

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

Cualquier ayuda sería apreciada. Gracias.

Respuestas

3 para la respuesta № 1

Solo puedes usar

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

Tenga en cuenta el paréntesis alrededor de la parte bang-bang. Esto solo es necesario porque probablemente esté usando una versión anterior de rlang. En versiones anteriores (<0.2) la !! Tiene una prioridad muy baja, por lo que la adición ocurre antes de la expansión. Comenzando con rlang 0.2 el !! se le ha dado una prioridad de operador diferente y funciona más como usted podría esperar.

Por supuesto, si está aplicando la misma transformación a un grupo de columnas, es posible que desee utilizar la mutate_at, mutate_all, o mutate_if versiones, que también permiten que las transformaciones sean específicas con la sintaxis de la fórmula.

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