问题描述
我只是在尝试 purrr 家族的 lambda 函数。
假设我必须通过 accumulate
对 vector 中上一次迭代的结果进行一些迭代操作,我可以通过 .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()
是一个三参数函数,其中第一个参数是先前计算的结果,其他两个参数直接传递。
有人可以告诉我在理解逻辑上哪里出错或错误,或者正确的做法应该是什么。
解决方法
只有在有两个参数时才指定 window.sessionStorage.getItem('username')
和 .x
。如果超过 2 个,我们可以按照出现的顺序使用 .y
、..1
、..2
..3
,
现在为了完整起见,我们知道如何使用它:
Reduce(function(x,y){
2 * x + 3 * vec[-1][y] + vec2[y]
},init = vec[1],seq_along(vec)[-length(vec)],accumulate = TRUE)
[1] 1 9 29 73 165