/ / Použitie binárneho operátora v lazyevalovom hovore s rlang - r, dplyr, lazy - evaluation, rlang, standard - evaluation

Použitie binárneho operátora v lazyevalovom hovore s rlang - r, dplyr, lenivé - hodnotenie, rlang, štandard - hodnotenie

Povedzme, že chcem pridať 1 ku každej hodnote stĺpca pomocou dplyr a štandardné hodnotenie.

Môžem urobiť :

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

Ale čo keď by som chcel používať + ako binárny operátor a nie ako funkcia? Nemôžem zistiť, ako napísať + so symbolom v kúzle. Vo väčšine z mojich pokusov som dostal chybu pri pokuse o použitie nečínového argumentu (napr. Symbol) s binárnym operátorom +.

S zastaraným mutate_ môžeš použiť lazyeval::interp čo vám umožnilo jednoducho to urobiť:

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

Akákoľvek pomoc by bola ocenená. Vďaka.

odpovede:

3 pre odpoveď č. 1

Môžete jednoducho použiť

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

Všimnite si zátvorky okolo časti bang-bang. Toto je potrebné len preto, že pravdepodobne používate staršiu verziu rlangu. V starších verziách (<0,2) !! má veľmi nízku prioritu, takže pridanie sa stáva pred rozšírením. Začínajúc rlang 0.2 !! bola daná iná prednosť operátora a funguje viac, ako by ste mohli očakávať.

Samozrejme, ak používate rovnakú transformáciu na veľa stĺpcov, možno budete chcieť použiť mutate_at, mutate_all, alebo mutate_if verzie, ktoré tiež umožňujú, aby transformácie boli špecifické so syntaxou vzorca.

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