如何直接在 purrr::accumulate2() 中编写自定义函数
How to write a custom function directly inside purrr::accumulate2()
我只是在尝试 purrr
系列的 lambda 函数。
假设我必须通过 accumulate
对向量中先前迭代的结果进行一些迭代操作,我可以通过 .x 和 .y 来完成,其中 .x
是对前一个元素的应用结果.y
是当前元素。还假设 function/iteration 是 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
是一个三参数函数,其中第一个参数是先前计算的结果,其他两个参数直接传递。
谁能告诉我我哪里错了或理解逻辑有误,或者正确的做法应该是什么。
.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
为了完整起见,现在我们知道如何使用它了:
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
我只是在尝试 purrr
系列的 lambda 函数。
假设我必须通过 accumulate
对向量中先前迭代的结果进行一些迭代操作,我可以通过 .x 和 .y 来完成,其中 .x
是对前一个元素的应用结果.y
是当前元素。还假设 function/iteration 是 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
是一个三参数函数,其中第一个参数是先前计算的结果,其他两个参数直接传递。
谁能告诉我我哪里错了或理解逻辑有误,或者正确的做法应该是什么。
.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
为了完整起见,现在我们知道如何使用它了:
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