dplyr / tidyevaluation:如何将 mutate 中的表达式作为字符串传递?
dplyr / tidyevaluation: How to pass an expression in mutate as a string?
我想编写一个有两个输入的函数:一个新变量的名称和一个数学表达式。两个参数都以字符串形式出现。
此函数应采用 data.frame 并添加指定的新变量,该变量应为给定数学表达式的结果。
这是我尝试过的最小工作示例:
df <- tibble(A = 1:10, B = 1:10)
new_var <- "C"
expression <- "A + B"
example_fun <- function(new_var, expression) {
new_var_sym <- sym(new_var)
expression_sym <- sym(expression)
mutate(df, !! new_var_sym := !! expression_sym)
}
example_fun(new_var, expression)
这会产生以下错误:
Error in mutate_impl(.data, dots) : Binding not found: A + B.
当我用 expr()
包裹函数中的 mutate 行时,我得到
mutate(df, `:=`(C, `A + B`))
似乎 A + B
周围的蜱虫不应该在那里,但我不知道如何摆脱它们。至少,enquo()
和 quo_name()
没有帮助。
我们可以将quosure/quote作为表达式,然后进行求值(!!
)。另外,:=
的 lhs 可以带字符串,所以我们不需要将 'new_var' 转换为 symbol
library(tidyverse)
library(rlang)
expression <- quo(A + B)
example_fun <- function(new_var, expression) {
df %>%
mutate(!! new_var := !! expression)
}
example_fun(new_var, expression)
# A tibble: 10 x 3
# A B C
# <int> <int> <int>
# 1 1 1 2
# 2 2 2 4
# 3 3 3 6
# 4 4 4 8
# 5 5 5 10
# 6 6 6 12
# 7 7 7 14
# 8 8 8 16
# 9 9 9 18
#10 10 10 20
如果我们真的想作为 character
字符串传递,那么使用 parse_expr
expression <- "A + B"
example_fun <- function(new_var, expression) {
df %>%
mutate(!! new_var := !! parse_expr(expression))
}
example_fun(new_var, expression)
# A tibble: 10 x 3
# A B C
# <int> <int> <int>
# 1 1 1 2
# 2 2 2 4
# 3 3 3 6
# 4 4 4 8
# 5 5 5 10
# 6 6 6 12
# 7 7 7 14
# 8 8 8 16
# 9 9 9 18
#10 10 10 20
我想编写一个有两个输入的函数:一个新变量的名称和一个数学表达式。两个参数都以字符串形式出现。
此函数应采用 data.frame 并添加指定的新变量,该变量应为给定数学表达式的结果。
这是我尝试过的最小工作示例:
df <- tibble(A = 1:10, B = 1:10)
new_var <- "C"
expression <- "A + B"
example_fun <- function(new_var, expression) {
new_var_sym <- sym(new_var)
expression_sym <- sym(expression)
mutate(df, !! new_var_sym := !! expression_sym)
}
example_fun(new_var, expression)
这会产生以下错误:
Error in mutate_impl(.data, dots) : Binding not found: A + B.
当我用 expr()
包裹函数中的 mutate 行时,我得到
mutate(df, `:=`(C, `A + B`))
似乎 A + B
周围的蜱虫不应该在那里,但我不知道如何摆脱它们。至少,enquo()
和 quo_name()
没有帮助。
我们可以将quosure/quote作为表达式,然后进行求值(!!
)。另外,:=
的 lhs 可以带字符串,所以我们不需要将 'new_var' 转换为 symbol
library(tidyverse)
library(rlang)
expression <- quo(A + B)
example_fun <- function(new_var, expression) {
df %>%
mutate(!! new_var := !! expression)
}
example_fun(new_var, expression)
# A tibble: 10 x 3
# A B C
# <int> <int> <int>
# 1 1 1 2
# 2 2 2 4
# 3 3 3 6
# 4 4 4 8
# 5 5 5 10
# 6 6 6 12
# 7 7 7 14
# 8 8 8 16
# 9 9 9 18
#10 10 10 20
如果我们真的想作为 character
字符串传递,那么使用 parse_expr
expression <- "A + B"
example_fun <- function(new_var, expression) {
df %>%
mutate(!! new_var := !! parse_expr(expression))
}
example_fun(new_var, expression)
# A tibble: 10 x 3
# A B C
# <int> <int> <int>
# 1 1 1 2
# 2 2 2 4
# 3 3 3 6
# 4 4 4 8
# 5 5 5 10
# 6 6 6 12
# 7 7 7 14
# 8 8 8 16
# 9 9 9 18
#10 10 10 20