在 rlang 的 lazyeval 调用中使用二元运算符
Using binary operator in lazyeval call with rlang
假设我想使用 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))
如有任何帮助,我们将不胜感激。谢谢。
你可以直接使用
mutate(data, !!rlang::sym(var) := (!!rlang::sym(var)) + 1)
请注意 bang-bang 部分的括号。这是必要的,因为您可能使用的是旧版本的 rlang。在旧版本(<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)
假设我想使用 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))
如有任何帮助,我们将不胜感激。谢谢。
你可以直接使用
mutate(data, !!rlang::sym(var) := (!!rlang::sym(var)) + 1)
请注意 bang-bang 部分的括号。这是必要的,因为您可能使用的是旧版本的 rlang。在旧版本(<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)