如何在 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
我正在尝试编写一个函数,该函数通过将另外两列相乘来创建一个新列,所有三列的名称都作为函数的(字符串)参数给出。
我在想我可以写这样的东西:
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