如何引用一个表达式,该表达式包含对其中的字符串进行引用和取消引用的调用?
How do I quote an expression that contains a call to quote and unquote a string within it?
我想创建一个在 dplyr::summarize 中使用的函数,它可以将当前组变量作为字符串检索,然后创建一个表达式来使用该组变量字符串来获取组的当前值。
我有直接从 summarize 调用的工作示例,但未能使功能正常工作。我正在努力弄清楚它有什么问题,但我想知道它是否与表达式的解析顺序有关?但是,我对此很陌生,所以希望能提供任何帮助。
library(rlang)
library(dplyr)
get_group <- function(df) {
group <- group_vars(df)
exp <- paste0("unique(!!sym('", group, "'))")
parse_expr(exp)
}
df <- tibble(
x = c("a", "b", "c", "a", "b"),
y = c(1, 2, 3, 4, 2)
)
df %>% group_by(x) %>%
summarize(z = unique(!!sym(group_vars(.))))
#> # A tibble: 3 x 2
#> x z
#> <chr> <chr>
#> 1 a a
#> 2 b b
#> 3 c c
df %>% group_by(x) %>%
summarize(z = !!get_group(.))
#> Error in !sym("x"): invalid argument type
如果您使用rlang
,您应该尽量避免将字符串解析为表达式。考虑这个替代方案,其中 get_group
returns 一个正确的 quosure 符号已经扩展
get_group <- function(df) {
group <- group_vars(df)
quo(unique(!!sym(group)))
}
df %>% group_by(x) %>%
summarize(z = !!get_group(.))
# # A tibble: 3 x 2
# x z
# <chr> <chr>
# 1 a a
# 2 b b
# 3 c c
我想创建一个在 dplyr::summarize 中使用的函数,它可以将当前组变量作为字符串检索,然后创建一个表达式来使用该组变量字符串来获取组的当前值。
我有直接从 summarize 调用的工作示例,但未能使功能正常工作。我正在努力弄清楚它有什么问题,但我想知道它是否与表达式的解析顺序有关?但是,我对此很陌生,所以希望能提供任何帮助。
library(rlang)
library(dplyr)
get_group <- function(df) {
group <- group_vars(df)
exp <- paste0("unique(!!sym('", group, "'))")
parse_expr(exp)
}
df <- tibble(
x = c("a", "b", "c", "a", "b"),
y = c(1, 2, 3, 4, 2)
)
df %>% group_by(x) %>%
summarize(z = unique(!!sym(group_vars(.))))
#> # A tibble: 3 x 2
#> x z
#> <chr> <chr>
#> 1 a a
#> 2 b b
#> 3 c c
df %>% group_by(x) %>%
summarize(z = !!get_group(.))
#> Error in !sym("x"): invalid argument type
如果您使用rlang
,您应该尽量避免将字符串解析为表达式。考虑这个替代方案,其中 get_group
returns 一个正确的 quosure 符号已经扩展
get_group <- function(df) {
group <- group_vars(df)
quo(unique(!!sym(group)))
}
df %>% group_by(x) %>%
summarize(z = !!get_group(.))
# # A tibble: 3 x 2
# x z
# <chr> <chr>
# 1 a a
# 2 b b
# 3 c c