在lazyeval中使用二元运算符调用rlang

问题描述 投票:1回答:1

假设我想使用dplyr和标准评估为列的每个值添加1。

我可以 :

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))

任何帮助,将不胜感激。谢谢。

r dplyr lazy-evaluation rlang standard-evaluation
1个回答
3
投票

你可以使用

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

请注意bang-bang部分周围的括号。这只是必要的,因为您可能正在使用旧版本的rlang。在旧版本(<0.2)中,!!具有非常低的优先级,因此在扩展之前添加。从rlang 0.2开始,!!被赋予了不同的运算符优先级,并且更符合您的预期。

当然,如果要将相同的转换应用于一堆列,则可能需要使用mutate_atmutate_allmutate_if版本,这些版本也允许使用公式语法进行转换。

mutate_if(data, is.numeric, ~.x+1)
mutate_all(data, ~.x+1)
mutate_at(data, var, ~.x+1)
© www.soinside.com 2019 - 2024. All rights reserved.