мурлыкать накопить функцию странный вывод - PullRequest
1 голос
/ 02 июня 2019

Полагаю, это комбинация из двух вопросов.

Я пытаюсь понять функцию purrr::accumulate, но с трудом выясняю взаимодействие между .x и .y.Я читал purrr виньетка, но это мало что объясняет.У меня нет опыта программирования, поэтому многое из этого у меня над головой.

Во-первых, почему у них разные выходы, когда они имеют один и тот же вызов?Единственная разница - () после paste.

accumulate(letters[1:5], paste, sep = ".")
[1] "a"         "a.b"       "a.b.c"     "a.b.c.d"   "a.b.c.d.e"

accumulate(letters[1:5], paste(), sep = ".")
[1] "a" "a" "a" "a" "a"

Во-вторых, что здесь происходит?

2:11 %>% accumulate(~ .x)
[1] 2 2 2 2 2 2 2 2 2 2

accumulate(1:5, `+`)
[1]  1  3  6 10 15

2:11 %>% accumulate(~ .y)
[1]  2  3  4  5  6  7  8  9 10 11

2:11 %>% accumulate(~ .x + .y)
[1]  2  5  9 14 20 27 35 44 54 65

.x - это накопленное значение, но я думаю,это ничего не накапливает?Это имеет смысл для 1:5 как cumsum..y - элемент в списке.Правильно ли я интерпретировать .y как по существу print?

Но разве первый вывод .x + .y не будет 4?

Некоторое понимание было бы очень желательно.

1 Ответ

2 голосов
/ 02 июня 2019

Было бы легче понять, когда есть 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"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...