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

时间:2019-08-14 17:05:22

标签: r purrr tidyeval

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

以下是一些数据:

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

感谢您的帮助。

1 个答案:

答案 0 :(得分:2)

您忘记取消对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-unquote的快捷方式。但是,要构造新的列名,您需要执行一些稍有不同的操作:先将“ enthen-then-to-string-then-concatenate-then-unquote”。

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