2

阅读使用 dplyr 编程的指南,我可以...一次引用所有变量。但是我怎样才能单独使用它们呢?

这是一个计算两个变量的函数。它成功使用quos()and !!!

library(dplyr) # version 0.6 or higher
library(tidyr)

# counts two variables
my_fun <- function(dat, ...){

  cols <- quos(...)

  dat <- dat %>%
    count(!!!cols)

  dat

}

my_fun(mtcars, cyl, am)

#> # A tibble: 6 x 3
#>     cyl    am     n
#>   <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

现在我想要tidyr::spread第二个变量,在这种情况下是am列。当我添加到我的功能时:

result <- dat %>%
    tidyr::spread(!!!cols[[2]], "n", fill = 0)

我得到:

错误:无效的列规范

我应该如何仅引用cols <- quos(...)列表的第二个变量?

4

2 回答 2

3

目前尚不清楚是否spread可以使用quosure。一个选项是spread_与字符串一起使用

my_fun <- function(dat, ...){

  cols <- quos(...)

  dat %>%
    select(!!! cols) %>% 
    count(!!! cols) %>%
    spread_(quo_name(cols[[2]]), "n", fill = 0)

   }

my_fun(mtcars, cyl, am)
# A tibble: 3 x 3
#   cyl   `0`   `1`
#* <dbl> <dbl> <dbl>
#1     4     3     8
#2     6     4     3
#3     8    12     2
于 2017-05-24T19:18:06.447 回答
1

请改用命名参数。如果您依赖于对 ... 列表的不同元素做不同的事情,那么只有明确才是有意义的,这样才能更容易理解每​​个输入在做什么,并使您更容易操作。

于 2017-05-24T19:06:31.790 回答