【问题标题】:Assigning to a quosure in R / dplyr / rlang分配给 R / dplyr / rlang 中的 quosure
【发布时间】:2018-04-26 19:44:14
【问题描述】:

在一个函数中,我想就地更新用户指定的列的值,其中用户指定的列名是通过 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)

此操作失败并出现错误:“:= 的 LHS 必须是字符串或符号”。

例如,我也尝试将(!! 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

提前致谢。

【问题讨论】:

    标签: r dplyr rlang


    【解决方案1】:

    您需要使用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)
    

    【讨论】:

    • 美丽。谢谢!
    • 仅供参考,@DaveBraze,这是我与rlang 相关的所有事情的首选。你可能已经看过了,但我的回答直接来自这里:dplyr.tidyverse.org/articles/programming.html
    • 我认为我没有读过那篇特定的文章,我在谷歌上搜索 rlang 指针,而不是 dplyr。感谢您的额外提示。
    • 另外,我现在看到 rlang::f_text() 的工作方式与 quo_name() 完全相同,尽管它不是从 dplyr 重新导出的。
    猜你喜欢
    • 1970-01-01
    • 2017-10-26
    • 1970-01-01
    • 2021-05-02
    • 2018-06-03
    • 2021-03-30
    • 2018-09-14
    • 2019-08-26
    • 1970-01-01
    相关资源
    最近更新 更多