导出为值的名称,格式为name1,name2,nameN,

问题描述 投票:0回答:1

在此示例中,我有一个简单的函数,它通过...传递变量名,并利用enquos函数将其传递给dplyr中的enquos运算符。

基本功能

group_by

结果

group_by

问题

我想扩展上面的函数,除了产生的结果之外,还要创建一个新的标量字符,该标量字符将以# Libraries library(dplyr) library(rlang) sample_function <- function(x, ...) { group_vars <- enquos(...) x %>% group_by(!!!group_vars) %>% summarise(num_obs = n()) } 的格式反映传递给mtcars %>% sample_function(cyl, am) # A tibble: 6 x 3 # Groups: cyl [3] cyl am num_obs <dbl> <dbl> <int> 1 4 0 3 2 4 1 8 3 6 0 4 4 6 1 3 5 8 0 12 6 8 1 2 的变量的名称。

尝试

enquos

结果

生产的字符串与所需的格式不匹配。

"var1, var2, ..."

期望的结果

仅返回最初通过library(dplyr) library(rlang) sample_function <- function(x, ...) { group_vars <- enquos(...) # Problem: # Create test object of quoted variables assign(x = "used_group_variables", value = quo_text(group_vars), envir = globalenv()) # Summary x %>% group_by(!!!group_vars) %>% summarise(num_obs = n()) } 传递的所有变量的名称,并以“`”作为分隔符进行粘贴。

used_group_variables
# [1] "structure(list(~cyl, ~am), .Names = c(\"\", \"\"), class = c(\"quosures\", \n\"list\"))"

注意

  • 诚然,从函数内部将值分配给全局环境不是一个好习惯。这样做仅出于说明目的。实际上,关键目标是将enquos中的所有内容强制转换为used_group_variables # "cyl, am" 格式的字符串。
r dplyr rlang tidyeval
1个回答
1
投票

您可以使用enquos并用"name1, name2, ..."折叠:

sapply

输出:

toString

编辑:如@LionelHenry在评论中所建议,您可能想使用sample_function <- function(x, ...) { group_vars <- enquos(...) assign(x = "used_group_variables", value = toString(sapply(group_vars, quo_name)), envir = globalenv()) x %>% group_by(!!!group_vars) %>% summarise(num_obs = n()) } 而不是mtcars %>% sample_function(am, cyl) used_group_variables # [1] "am, cyl" ,因为后者会误导人,并且可能会被弃用。

© www.soinside.com 2019 - 2024. All rights reserved.