如何在 R 的公式中使用 use quos?

How to write use quos in a formula in R?

我正在尝试编写一个函数,该函数通过将另外两列相乘来创建一个新列,所有三列的名称都作为函数的(字符串)参数给出。

我在想我可以写这样的东西:

A <- data.frame(x = 1:5, y = 11:15)

f <- function(x, y, new) {
  x_quo <- rlang::enquo(x)
  y_quo <- rlang::enquo(y)
  new_quo <- rlang::enquo(new)
  A %<>% mutate (!!new_quo := !!x_quo * !!y_quo)
  A
}

f("x", "y", "new")

我原以为这等同于 运行宁这个代码:

A <- data.frame(x = 1:5, y = 11:15)
A %<>% mutate (new = x * y);

但是,当我 运行 第一个代码时,我得到这个错误:

 Error: Problem with `mutate()` input `new`.
 x non-numeric argument to binary operator
 i Input `new` is `"x" * "y"`.
 Run `rlang::last_error()` to see where the error occurred. 

这个错误是什么意思?有没有办法像我描述的那样创建一个函数?

尝试使用 sym 并使用 !! 对其进行评估。我还会将额外的数据参数传递给函数。

library(dplyr)
library(rlang)

f <- function(data, x, y, new) {
  data %>% mutate (!!new := !!sym(x) * !!sym(y))
}

A %>% f("x", "y", "new")

#  x  y new
#1 1 11  11
#2 2 12  24
#3 3 13  39
#4 4 14  56
#5 5 15  75

identical(A %>% f("x", "y", "new"), A %>% mutate (new = x * y))
#[1] TRUE