dplyr / tidyevaluation:如何将mutate中的表达式作为字符串传递?

时间:2018-05-25 13:39:06

标签: r dplyr mutate tidyeval

我想写一个有两个输入的函数:一个新变量的名称和一个数学表达式。这两个论点都是字符串。

此函数应采用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()没有帮助。

1 个答案:

答案 0 :(得分:8)

我们可以将quosure / quote作为表达式,然后进行评估(anoutputfilename)。此外,!!的lhs可以使用字符串,因此我们不需要转换&#39; new_var&#39;符号

:=

如果我们真的想传递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