Было бы легче понять, когда есть print
операторы
2:11 %>%
accumulate(~ {
print("---step----")
print(paste0(".x: ", .x))
print(paste0(".y: ", .y))
print(.x + .y)
})
#[1] "---step----"
#[1] ".x: 2" # .init or first value of the vector (as `.init` not specified)
#[1] ".y: 3" # second value
#[1] 5 # sum of .x + .y
#[1] "---step----"
#[1] ".x: 5" # note .x gets updated with the sum
#[1] ".y: 4" # .y gets the next element
#[1] 9
#[1] "---step----"
#[1] ".x: 9" # similarly in all the below steps
#[1] ".y: 5"
#[1] 14
#[1] "---step----"
#[1] ".x: 14"
#[1] ".y: 6"
#[1] 20
#[1] "---step----"
#[1] ".x: 20"
#[1] ".y: 7"
#[1] 27
#[1] "---step----"
#[1] ".x: 27"
#[1] ".y: 8"
#[1] 35
#[1] "---step----"
#[1] ".x: 35"
#[1] ".y: 9"
#[1] 44
#[1] "---step----"
#[1] ".x: 44"
#[1] ".y: 10"
#[1] 54
#[1] "---step----"
#[1] ".x: 54"
#[1] ".y: 11"
#[1] 65
# [1] 2 5 9 14 20 27 35 44 54 65
Здесь .x
- это то, что обновляется в каждой итерации, и это значение передается в .x + .y
Это по сути похоже на
cumsum(2:11)
#[1] 2 5 9 14 20 27 35 44 54 65
Когда мы передаем только .x
, это значение .init
, то есть первый элемент, который не обновляется как .f
ничего не делает
2:11 %>%
accumulate(~ print(.x))
#[1] 2
#[1] 2
#[1] 2
#[1] 2
#[1] 2
#[1] 2
#[1] 2
#[1] 2
#[1] 2
# [1] 2 2 2 2 2 2 2 2 2 2
Теперь мы передаем .init
другое значение
2:11 %>%
accumulate(~ print(.x), .init = 5)
#[1] 5
#[1] 5
#[1] 5
#[1] 5
#[1] 5
#[1] 5
#[1] 5
#[1] 5
#[1] 5
#[1] 5
#[1] 5 5 5 5 5 5 5 5 5 5 5
Кроме того, разница в первых двух вызовах, это разница в передачеаргументы.В первом случае с paste
, .x
и .y
неявно передаются, в то время как во втором paste()
это только .x
, то есть вход в него
accumulate(letters[1:5], ~paste(.x, .y, sep = "."))
#[1] "a" "a.b" "a.b.c" "a.b.c.d" "a.b.c.d.e"
accumulate(letters[1:5], ~paste(.x, sep = "."))
#[1] "a" "a" "a" "a" "a"