在 R / dplyr / rlang 中分配给一个 quosure
Assigning to a quosure in R / dplyr / rlang
在一个函数中,我想就地更新用户指定的列的值,其中用户指定的列名是通过 enquo() 捕获的。所以,这是一个简化的例子:
f1 <- function(df, x, y) {
x <- enquo(x)
y <- enquo(y)
df %>%
mutate((!! x) := (!! x)^2,
(!! y) := (!! y)+1)
}
dat <- data.frame(a=1:10, b=10:1)
f1(dat, x=a, y=b)
失败并出现错误:"The LHS of :=
must be a string or a symbol"。
我也尝试过将 (!! x)
替换为 quo_get_expr(x)
和 f_text(x)
,但出现相同的错误。例如:
f1 <- function(df, x, y) {
x <- enquo(x)
y <- enquo(y)
df %>%
mutate(quo_get_expr(x) := (!! x)^2,
quo_get_expr(y) := (!! y)+1)
}
谁能指出我做错了什么?
我正在使用 R 4.1、dplyr 0.7.4 和 rlang 0.2.0
提前致谢。
您需要使用 quo_name
。这有效:
f1 <- function(df, x, y) {
x <- enquo(x)
y <- enquo(y)
df %>%
mutate(
!!quo_name(x) := (!!x)^2,
!!quo_name(y) := (!!y)+1)
}
dat <- data.frame(a=1:10, b=10:1)
f1(dat, x=a, y=b)
在一个函数中,我想就地更新用户指定的列的值,其中用户指定的列名是通过 enquo() 捕获的。所以,这是一个简化的例子:
f1 <- function(df, x, y) {
x <- enquo(x)
y <- enquo(y)
df %>%
mutate((!! x) := (!! x)^2,
(!! y) := (!! y)+1)
}
dat <- data.frame(a=1:10, b=10:1)
f1(dat, x=a, y=b)
失败并出现错误:"The LHS of :=
must be a string or a symbol"。
我也尝试过将 (!! x)
替换为 quo_get_expr(x)
和 f_text(x)
,但出现相同的错误。例如:
f1 <- function(df, x, y) {
x <- enquo(x)
y <- enquo(y)
df %>%
mutate(quo_get_expr(x) := (!! x)^2,
quo_get_expr(y) := (!! y)+1)
}
谁能指出我做错了什么?
我正在使用 R 4.1、dplyr 0.7.4 和 rlang 0.2.0
提前致谢。
您需要使用 quo_name
。这有效:
f1 <- function(df, x, y) {
x <- enquo(x)
y <- enquo(y)
df %>%
mutate(
!!quo_name(x) := (!!x)^2,
!!quo_name(y) := (!!y)+1)
}
dat <- data.frame(a=1:10, b=10:1)
f1(dat, x=a, y=b)