如何直接在 purrr::accumulate2() 中编写自定义函数

问题描述

我只是在尝试 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

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...