了解累加函数的工作原理

问题描述

我阅读了使用 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

相关问答

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