首页 > 解决方案 > 如何直接在 purrr::accumulate2() 中编写自定义函数

问题描述

我只是在尝试purrr家庭的 lambda 函数。

假设我必须对向量中先前迭代的结果进行迭代操作,accumulate我可以通过 .x 和 .y 进行操作,其中.x是应用在前一个元素上的结果,.y是当前元素。还假设函数/迭代是2x+3y前一个结果的两倍,加上当前元素的三倍,可以通过like来完成。

accumulate(1:10, ~2*.x + 3*.y)
 [1]    1    8   25   62  139  296  613 1250 2527 5084

#OR
accumulate(1:10, ~2*.x + 3*.y, .init = 2.5)
 [1]    2.5    8.0   22.0   53.0  118.0  251.0  520.0 1061.0 2146.0 4319.0 8668.0

但是,我无法在这些类型的迭代中这样做accumulate2

accumulate2(1:5, 1:5, ~2*.x + 3*.y +.z)
Error in reduce2_impl(.x, .y, .f, ..., .init = .init, .acc = TRUE) : 
  `.y` does not have length 4

或者

accumulate2(1:5, 1:4, ~2*.x + 3*.y +.z)
Error in .f(out, .x[[x_i]], .y[[y_i]], ...) : object '.z' not found

实际上我理解的purrr::accumulate是,它是一个双参数函数,其中第一个参数是前一次迭代的结果,第二个参数是直接传递给它的向量。在类似的行accumulate2上是一个三参数函数,其中第一个参数是先前计算的结果,其他两个参数直接传递。

有人可以告诉我在理解逻辑方面哪里出错或错误,或者正确的做法应该是什么。

标签: rlambdapurrranonymous-functionaccumulate

解决方案


.x.y在有两个参数时指定。如果超过 2,我们可以按出现顺序使用..1, ..2,..3

library(purrr)
accumulate2(1:5, 1:4, ~2*..1 + 3*..2 +..3)
#[[1]]
#[1] 1

#[[2]]
#[1] 9

#[[3]]
#[1] 29

#[[4]]
#[1] 73

#[[5]]
#[1] 165

推荐阅读