我想创建一个新列,其名称是我给函数提供的两个参数的组合。
以下是一些数据:
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))
}
感谢您的帮助。
答案 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”。
{{…}}
不允许您在引号和反引号之间插入操作,因此,实现此操作的唯一方法是将操作拆分并手动执行,如上面的代码所示。