r - 如何引用包含引用调用的表达式并取消引用其中的字符串?

标签 r tidyverse rlang tidyeval

我想创建一个在 dplyr::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 返回已扩展符号的适当的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 

关于r - 如何引用包含引用调用的表达式并取消引用其中的字符串?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57909576/

相关文章:

r - 在 dplyr 的函数中使用字符串

使用 dplyr 进行滚动回归

r - 每月返回和不等月长度

r - 如何使用 rvest 获取 html_table 中的链接?

r - 使用 dplyr 进行多变量汇总

r - 使用 `!!` 而不附加 `rlang`

r - 在R中合并具有特定条件的两个数据帧

r - 如何删除不满足所有条件的所有行(每组)?

r - ggplot2 创建多个图但没有facet_wrap

r - 连接quosures和字符串