如何使Purrr invoke_map与闭包一起使用

时间:2018-08-30 04:57:57

标签: r dplyr purrr

为了创建一个处理移动平均值的函数,我遇到了这个问题。使用dplyr和purrr,我试图生成一个闭包列表。

v <- 5
funs <- map(1:v, ~ . %>% lag(n = .x)  ) 

虽然funs[[1]](rnorm(100))funs[[2]](rnorm(100))可以工作,但我并没有设法使这行工作:

invoke_map(funs, rnorm(100))

为什么会这样?

1 个答案:

答案 0 :(得分:3)

invoke_map不确定您要如何迭代。这是一个非常灵活的函数,有时会在函数之间,有时会在参数之间以及有时在两者之间进行迭代。为了明确表明只希望它遍历函数,请指定应将参数rnorm(x)移至哪个位置,尽管如果保留传统的函数结构而不是函数序列,这样做会更容易:

library(purrr)
set.seed(47)

funs <- map(1:5, ~partial(dplyr::lag, n = .x)) 

funs %>% 
    invoke_map(x = rnorm(10)) %>% 
    str(vec.len = 10)
#> List of 5
#>  $ : num [1:10] NA 1.9947 0.7111 0.1854 -0.2818 0.1088 -1.0857 -0.9855 0.0151 -0.252
#>  $ : num [1:10] NA NA 1.9947 0.7111 0.1854 -0.2818 0.1088 -1.0857 -0.9855 0.0151
#>  $ : num [1:10] NA NA NA 1.995 0.711 0.185 -0.282 0.109 -1.086 -0.985
#>  $ : num [1:10] NA NA NA NA 1.995 0.711 0.185 -0.282 0.109 -1.086
#>  $ : num [1:10] NA NA NA NA NA 1.995 0.711 0.185 -0.282 0.109