dplyr describe()在c()内部使用单个变量,但在函数内部求值时不在c()内部使用多个变量

时间:2019-03-08 00:18:56

标签: r function dplyr tidyeval

我在网上可以找到的有关提迪耶瓦尔的所有信息都是较旧的并且不是最新版本的tidyverse \ dplyr的最新版本,否则可能并不适用。

一个小例子是:

df <- tribble(
       ~var1, ~var2, ~var3,
         1,     2,     3,
         4,     5,     6,
         7,     8,     9
        )

我写了一个小函数:

fun <- function(data, select_var, arrange_var) {
   select_var <- enquo(select_var)
   arrange_var <- enquo(arrange_var)

   data %>%
     select(!!select_var) %>%
     arrange(!!arrange_var)
   }

该函数仅选择列,然后按行排列。

当我将参数传递给函数时,它可以在c()内部使用单个变量正常工作:

fun(df, 
    c(var1,
      var2)),
    c(var2))

但是,当我尝试传递两个变量时,如下所示:

    fun(df, 
    c(var1,
      var2)),
    c(var1,
      var2))

我收到以下错误:

Error: incorrect size (282) at position 1, expecting : 141

我能够找到的最接近的堆栈响应是: arrange() doesn't recognize column name parameterPass a vector of variable names to arrange() in dplyr

但是这两个方法似乎都给出了包含过时解决方案的答案(例如,ranging _())

一些重要信息: tidyeval resource roundup,作者Mara Averick

Separating and Trimming Messy Data the Tidy Way,作者Paul Oldham

当然,我已经研究过:tidyeval

但是他们似乎都没有解决这个怪癖。度过一个下午后,我已经用光了资源。该代码可以在标准R文件中找到,只是无法使其在函数内部工作,但是快要放弃了,所以我想我想看看您的好伙伴是否可以提供帮助。预先感谢。

1 个答案:

答案 0 :(得分:3)

arrange_var代替...并指定变量而不将其括在c()中即可。

library("dplyr")

df <- tribble(
  ~var1, ~var2, ~var3,
  1, 2, 3,
  4, 5, 6,
  7, 8, 9
)

fun <- function(data, select_var, ...) {
  select_var <- enquo(select_var)
  data %>%
    select(!!select_var) %>%
    # You can pass the dots to `arrange` directly
    arrange(...)
}

fun(df, c(var1, var2), var2)
#> # A tibble: 3 x 2
#>    var1  var2
#>   <dbl> <dbl>
#> 1     1     2
#> 2     4     5
#> 3     7     8
fun(df, c(var1, var2), var1, var2)
#> # A tibble: 3 x 2
#>    var1  var2
#>   <dbl> <dbl>
#> 1     1     2
#> 2     4     5
#> 3     7     8

reprex package(v0.2.1)于2019-03-08创建

事实证明,只有select支持字符串和字符向量。如文档所述,“这与字符串不明确的其他动词不同。” 请参见上一示例dplyr::select

# Two alternatives; both work with `select`.
df %>%
  select(var1, var2)
#> # A tibble: 3 x 2
#>    var1  var2
#>   <dbl> <dbl>
#> 1     1     2
#> 2     4     5
#> 3     7     8
df %>%
  select(c(var1, var2))
#> # A tibble: 3 x 2
#>    var1  var2
#>   <dbl> <dbl>
#> 1     1     2
#> 2     4     5
#> 3     7     8

# `arrange` only works with lists on comma separated unquoted variable names.
df %>%
  arrange(var1, var2)
#> # A tibble: 3 x 3
#>    var1  var2  var3
#>   <dbl> <dbl> <dbl>
#> 1     1     2     3
#> 2     4     5     6
#> 3     7     8     9
df %>%
  arrange(c(var, var2))
#> Error: incorrect size (4) at position 1, expecting : 3

reprex package(v0.2.1)于2019-03-08创建