将参数作为承诺传递给使用双括号的其他函数

passing argument as promise to other function that uses double brace

我熟悉 embrace dplyr syntax,它允许将未加引号的变量名称作为参数动态传递给函数。例如定义

library(dplyr)
pull_column <- function(tb, colname) {
    tb %>% 
        pull({{colname}})
}

可以通过 运行

starwars 小标题中拉出例如 name
starwars %>% pull_column(name)

我的目标是创建另一个函数,它也接受一个 colname 参数,然后使用提供的值作为参数转发给 pull_column() 函数。例如,这个函数首先按眼睛颜色过滤,然后调用 pull_column():

pull_column_for_eyecolor <- function(tb, colname, eyecolor){
    tb %>% 
        filter(eye_color == eyecolor) %>% 
        pull_column(colname)
}

然而,当我调用此函数以通过

获取 yellow-eyed 个字符的名称时
starwars %>% pull_column_for_eyecolor(name, "yellow")

我明白了

Error: object 'name' not found

有没有办法为 pull_column()pull_column_for_eyecolor() 函数的 colname 参数提供一个不带引号的值,而不会 运行 出错?

将您的 pull_column_for_eyecolor 函数写成

pull_column_for_eyecolor <- function(tb, colname, eyecolor){
  qColName <- enquo(colname)
  tb %>% 
    filter(eye_color == eyecolor) %>% 
    pull_column(!! qColName)
}

所以

starwars %>% pull_column_for_eyecolor(name, "yellow")
 [1] "C-3PO"             "Darth Vader"       "Palpatine"         "Watto"             "Darth Maul"        "Dud Bolt"          "Ki-Adi-Mundi"      "Yarael Poof"       "Poggle the Lesser"
[10] "Zam Wesell"        "Dexter Jettster"

有关详细信息,请参阅 here。这是一个经典的non-standard评估问题。