在 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)