使用invoke_map将变量名称作为args传递

时间:2017-09-19 13:48:47

标签: r dplyr purrr

我想使用invoke_map来调用函数列表。我有一组变量名称,我想用它们作为每个函数的参数。最终,变量名称将与group_by一起使用。

以下是一个例子:

library(dplyr)
library(purrr)
first_fun <- function(...){
  by_group = quos(...)
  mtcars %>%
    group_by(!!!by_group) %>%
    count()
}

second_fun <- function(...){
  by_group = quos(...)
  mtcars %>%
    group_by(!!!by_group) %>%
    summarise(avg_wt = mean(wt))
}

first_fun(mpg, cyl) # works
second_fun(mpg, cyl) # works

both_funs <- list(first_fun, second_fun)

both_funs %>%
  invoke_map(mpg, cyl) # What do I do here?

我已经尝试过各种尝试将变量名称放在引号中,enquo它们,使用vars,引用.data$mpg等,但我在黑暗中刺了一下。 / p>

1 个答案:

答案 0 :(得分:2)

问题不在于您使用点,而是您正在使用名称,并且在调用map2_impl时会评估这些参数。

试试这个并探索环境:

debugonce(map2)
both_funs %>% invoke_map("mpg", "cyl")

另一方面,这是有效的:

first_fun2 <- function(...){
  mtcars %>%
  {do.call(group_by_,list(.,unlist(list(...))))} %>%
    count()
}

second_fun2 <- function(...){
  mtcars %>%
  {do.call(group_by_,list(.,unlist(list(...))))} %>%
    summarise(avg_wt = mean(wt))
}

both_funs2 <- list(first_fun2, second_fun2)
both_funs2 %>% invoke_map("mpg", "cyl") 

# [[1]]
# # A tibble: 25 x 2
# # Groups:   mpg [25]
# mpg     n
# <dbl> <int>
#   1  10.4     2
# 2  13.3     1
# 3  14.3     1
# 4  14.7     1
# 5  15.0     1
# 6  15.2     2
# 7  15.5     1
# 8  15.8     1
# 9  16.4     1
# 10  17.3     1
# # ... with 15 more rows
# 
# [[2]]
# # A tibble: 25 x 2
# mpg avg_wt
# <dbl>  <dbl>
#   1  10.4 5.3370
# 2  13.3 3.8400
# 3  14.3 3.5700
# 4  14.7 5.3450
# 5  15.0 3.5700
# 6  15.2 3.6075
# 7  15.5 3.5200
# 8  15.8 3.1700
# 9  16.4 4.0700
# 10  17.3 3.7300
# # ... with 15 more rows