Счетчик в карте мурлыканья * семейство функций - PullRequest
0 голосов
/ 14 января 2019

Мне часто нужно какое-то значение счетчика / индекса при применении функций цикла к векторам / списку. При использовании основных функций цикла этот индекс может быть создан путем последовательного добавления 1 к некоторому начальному значению. Рассмотрим следующий пример:

lets <- letters[1:5]

n = 0
for (le in lets){
  n = n+1
  print(paste(le,"has index",n))
}
#> [1] "a has index 1"
#> [1] "b has index 2"
#> [1] "c has index 3"
#> [1] "d has index 4"
#> [1] "e has index 5"

Единственный способ получить доступ к такому значению индекса с помощью функций цикла из пакета purrr - это использовать map2. Есть ли более элегантный способ сделать это, используя только purrr::map()?

library(purrr)


map2(lets,1:length(lets),~paste(.x,"has index",.y))

#> [[1]]
#> [1] "a has index 1"
#> 
#> [[2]]
#> [1] "b has index 2"
#> 
#> [[3]]
#> [1] "c has index 3"
#> 
#> [[4]]
#> [1] "d has index 4"
#> 
#> [[5]]
#> [1] "e has index 5"

Ответы [ 2 ]

0 голосов
/ 14 января 2019

Ближайшим приближением того, что вы ищете, является purrr::imap, который описан в документации как

сокращение для map2(x, names(x), ...), если x имеет имена, или map2(x, seq_along(x), ...), если нет.

Работает следующий код:

lets <- letters[1:5]

purrr::imap(lets, ~print(paste(.x, "has index", .y)))

Я предполагаю, что вы на самом деле пытаетесь создать новый объект и сохранить его в новой переменной. Если вы хотите показать вывод (как в этом примере, где результатом является print для консоли), вы должны использовать эквивалентную функцию iwalk, которая невидимо возвращает свой вывод.

0 голосов
/ 14 января 2019

Попробуйте imap

lets <- letters[1:5]
purrr::imap(lets, ~paste(.x,"has index",.y))
#[[1]]
#[1] "a has index 1"

#[[2]]
#[1] "b has index 2"

#[[3]]
#[1] "c has index 3"

#[[4]]
#[1] "d has index 4"

#[[5]]
#[1] "e has index 5"

Обратите внимание, что imap будет использовать имена элементов .x в качестве аргумента .y, если элементы названы. Если вы не хотите, используйте imap(unname(...), ...) - благодаря @ Moody_Mudskipper.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...