假设我想使用dplyr
和标准评估为列的每个值添加1。
我能做到:
library(dplyr)
data <- head(iris)
var <- "Sepal.Length"
mutate(data, !!rlang::sym(var) := !!quo(`+`(!!rlang::sym(var), 1)))
但是如果我想将+
用作二元运算符而不是函数呢?
我无法弄清楚如何在一个quosure中用符号写+
。
在我的大多数尝试中,我尝试使用二元运算符+
的非数字参数(例如符号)时出错。
对于已弃用的mutate_
,您可以使用lazyeval::interp
来轻松完成此操作:
mutate_(data, .dots = setNames(list(lazyeval::interp(~var + 1, var = as.symbol(var))), var))
任何帮助将不胜感激。感谢。
答案 0 :(得分:3)
你可以使用
mutate(data, !!rlang::sym(var) := (!!rlang::sym(var)) + 1)
请注意bang-bang部分周围的括号。这只是必要的,因为您可能正在使用旧版本的rlang。在旧版本(&lt; 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)