分配给R/dplyr/rlang中的一个quosure

分配给R/dplyr/rlang中的一个quosure,r,dplyr,rlang,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)

在函数中,我希望就地更新用户指定的列的值,其中用户指定的列名通过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)
有人能指出我做错了什么吗

我使用的是R4.1、DPLYR0.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)

f1很漂亮。非常感谢。仅供参考,@DaveBraze,这是我对所有与
rlang
有关的事情的看法。你可能已经看过了,但我的答案直接来自这里:我不认为我读过那篇文章,我在谷歌上搜索rlang指针,而不是dplyr。感谢您提供的额外提示。另外,值得一提的是,我现在看到rlang::f_text()将以与quo_name()完全相同的方式工作,尽管它不是从dplyr重新导出的。
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)