使用准引号命名新列时可以使用函数吗?

Can I use a function when naming new columns with quasiquotation?

我想创建一个新列,其名称是我为函数提供的两个参数的组合。

这是一些数据:

data <- tribble(
  ~one, ~two, ~three,
  'a','b', 'c',
  'd', 'e', 'f'
)

如果我只想给它起一个普通的名字,这样就可以了:

normal_naming_func <- function(data, name) {
  data %>% 
    mutate({{name}} := str_c(one, two))
}

但是如果我希望名称是两个不同函数参数的组合怎么办?

这行不通:

naming_func <- function(data, name_part1, name_part2) {
  data %>% 
    mutate(str_c({{name_part1}}, {{name_part2}}) := str_c(one, two))
}

我收到错误:

Error: The LHS of:=must be a string or a symbol

这也不行:

naming_func <- function(data, name_part1, name_part2) {
  data %>% 
    mutate(str_glue("{{name_part1}}, {{name_part2}}") := str_c(one, two))
}

感谢您的帮助。

您忘记取消对 LHS 的引用。此外,您需要先将未评估的名称转换为字符串,然后才能连接它们:

naming_func <- function(data, name_part1, name_part2) {
  name1 = as.character(ensym(name_part1))
  name2 = as.character(ensym(name_part2))
  data %>% 
    mutate(!! str_c(name1, name2) := str_c({{name_part1}}, {{name_part2}}))
}

请记住,{{…}} 是先引用后取消引用的快捷方式。但是,要构建新的列名,您需要一个稍微不同的操作:enquote-then-to-string-then-concatenate-then-unquote.

{{…}} 不允许您在引用和取消引用之间插入操作,因此实现此目的的唯一方法是拆分操作并手动执行它们,如上面的代码所示。