问题描述
我阅读了使用 accumulate
的手册,说它是一个 2 参数函数。我不明白给定的例子:
1:5 %>% accumulate(`+`)
#> [1] 1 3 6 10 15
如果 accumulate
是一个 2 参数函数,它输出的第一个元素应该是 3
吗?因为1+2=3
,为什么第一个元素可以作为输出?
解决方法
accumulate
是一个双参数函数,其中第一个参数是一个向量,第二个参数是一个函数。它的输出也是一个与输入长度相同的向量,除非提供了 .init
,在这种情况下,它将比输入长度大一个长度。
1:5 %>% accumulate(`+`)
#means
accumulate(1:5,`+`)
现在,accumulate
通过在提供的向量的各个元素之间滚动提供的函数来计算输出。由于作为输出的第二个参数提供的 operation
需要两个元素,即(i)前一个元素的输出和(ii)下一个元素,逻辑上第一次它可以输出输入向量的相同元素而不应用任何操作。
1:5 %>% accumulate(`+`)
#> [1] 1 3 6 10 15
即使提供了 .init
,情况也会相同,在这种情况下,输出向量的第一个元素将等于提供的 .init
。 (见罗纳克的例子)
library(purrr)
1:5 %>% accumulate(`+`,.init = 3)
#[1] 3 4 6 9 13 18
现在检查输出向量中有六个元素,尽管输入向量中有五个元素 (1:5)。
您认为给定输出的第一个元素应该是 3
的逻辑是正确的,但在大多数情况下,输出向量的要求与输入的长度相同。因此,开发人员可能会想到将第一个元素包含在内,而无需任何功能的操作/应用。
.init
参数决定输出中的第一个值。如果您没有指定任何内容,它将返回向量的第一个值作为输出中的第一个值(此处为 1)。
来自?accumulate
。
.init - 如果提供,将用作开始累积的第一个值,而不是使用 .x[[1]]。
您可以指定自己的 .init
参数。
library(purrr)
1:5 %>% accumulate(`+`,.init = 3)
#[1] 3 4 6 9 13 18