【问题标题】:Is it possible to pass multible variables to the same curly curly?是否可以将多个变量传递给同一个卷曲?
【发布时间】:2020-01-02 09:54:07
【问题描述】:

我正在构建一个使用 {{ }}(卷曲或双胡须)的函数

我希望用户能够将多个变量传递给同一个 {{ }},但我不确定这是否可以使用 {{ }}。我找不到任何示例来说明如何做到这一点。

您能否告诉我是否可以,如果可以,请帮助我完成以下最低限度的 reprex 工作?

library(tidyverse)

group_mean <- function(.data, group){
  .data %>% 
    group_by({{group}}) %>% 
    summarise_all(mean)

}

# Works
mtcars %>% 
  group_mean(group = cyl)

# Fails
mtcars %>% 
  group_mean(group = c(cyl, am)) 

Error: Column `c(cyl, am)` must be length 32 (the number of rows) or one, not 64 

【问题讨论】:

  • 以前从未见过。你需要的是group_by_at()...当然要使用NSE
  • 我不确定你以前从未见过它是什么。是错误还是使用 group_by()
  • 从未见过在 R 中用双花括号定义多个变量。
  • 奇怪的是它有时会起作用。例如,select_vars % select({{selected}}) %>% summarise_all(mean) } mtcars %>% select_vars(selected = c(cyl, mpg, hp) )
  • 根据this announcement of rlang 0.4.0 应使用... 传递多个参数:如果您想将多个参数传递给数据屏蔽动词,请直接传递...

标签: r tidyeval


【解决方案1】:

对于多个分组变量,你不需要 curly-curly,而是传递三个点。

group_mean <- function(.data, ...){
  .data %>% 
     group_by(...) %>% 
     summarise_all(mean)
}


mtcars %>%  group_mean(cyl)

# A tibble: 3 x 11
#    cyl   mpg  disp    hp  drat    wt  qsec    vs    am  gear  carb
#  <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
#1     4  26.7  105.  82.6  4.07  2.29  19.1 0.909 0.727  4.09  1.55
#2     6  19.7  183. 122.   3.59  3.12  18.0 0.571 0.429  3.86  3.43
#3     8  15.1  353. 209.   3.23  4.00  16.8 0     0.143  3.29  3.5 

mtcars %>%  group_mean(cyl, am)

#    cyl    am   mpg  disp    hp  drat    wt  qsec    vs  gear  carb
#  <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
#1     4     0  22.9 136.   84.7  3.77  2.94  21.0 1      3.67  1.67
#2     4     1  28.1  93.6  81.9  4.18  2.04  18.4 0.875  4.25  1.5 
#3     6     0  19.1 205.  115.   3.42  3.39  19.2 1      3.5   2.5 
#4     6     1  20.6 155   132.   3.81  2.76  16.3 0      4.33  4.67
#5     8     0  15.0 358.  194.   3.12  4.10  17.1 0      3     3.08
#6     8     1  15.4 326   300.   3.88  3.37  14.6 0      5     6   

【讨论】:

  • 谢谢。我正在构建的真正功能已经在其他地方使用了……。所以使用 ... 不幸的是不是一种选择。
  • @SteenHarsted 你能把你的函数分解成单独的函数,这样你就可以不同地使用... 吗?
  • 谢谢。是的,我想我将不得不尝试这样的事情。
【解决方案2】:

如果您的函数需要多组多个变量,则需要使用vars() 进行外部引用。该函数只是将其输入捕获为表达式列表:

vars(foo, bar)
#> [[1]]
#> <quosure>
#> expr: ^foo
#> env:  global
#>
#> [[2]]
#> <quosure>
#> expr: ^bar
#> env:  global

取一个与!!!拼接的参数:

group_mean <- function(.data, .vars, ...) {
  .data <- doingsomethingelse(.data, ...)

  .data %>% 
     group_by(!!!.vars) %>% 
     summarise_all(mean)
}

像这样使用它:

data %>% group_mean(vars(foo, bar), baz, quux)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-30
    • 1970-01-01
    • 2018-03-26
    相关资源
    最近更新 更多