使用准引号命名新列时可以使用函数吗?
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.
{{…}}
不允许您在引用和取消引用之间插入操作,因此实现此目的的唯一方法是拆分操作并手动执行它们,如上面的代码所示。
我想创建一个新列,其名称是我为函数提供的两个参数的组合。
这是一些数据:
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.
{{…}}
不允许您在引用和取消引用之间插入操作,因此实现此目的的唯一方法是拆分操作并手动执行它们,如上面的代码所示。