Подтвердить что ты не робот

purrr map эквивалент вложенного цикла

Что такое эквивалент purrr :: map:

for (i in 1:4) {
  for (j in 1:6) {
    print(paste(i, j, sep = "-"))
  }
}

ИЛИ ЖЕ

lapply(1:4, function(i) 
  lapply(1:6, function(j) 
    print(paste(i, j, sep = "-"))))

Понятно, что я не получаю, как обратиться к внешнему циклу во внутренней функции карты.

map(1:4, ~ map(1:6, ~ print(paste(.x, ????, sep = "-")))
4b9b3361

Ответ 1

Как указывает @r2evans, .x от вашего первого вызова маскируется. однако вы можете создать лямбда-функцию, которая принимает 2 параметра .x и .y и назначает предыдущий .x новому .y через ...

Я буду использовать walk а не map как в этом случае вас интересуют только побочные эффекты (печать)

walk(1:4,~ walk(1:6, ~ print(paste(.x, .y, sep = "-")),.y=.x))

Другим вариантом является использование expand.grid для expand.grid комбинаций, а затем pwalk с помощью pwalk (или pmap при других обстоятельствах)

purrr::pwalk(expand.grid(1:4,1:6),~print(paste(.x, .y, sep = "-")))

Выход в обоих случаях:

[1] "1-1"
[1] "2-1"
[1] "3-1"
[1] "4-1"
[1] "5-1"
[1] "6-1"
[1] "1-2"
[1] "2-2"
[1] "3-2"
[1] "4-2"
[1] "5-2"
[1] "6-2"
[1] "1-3"
[1] "2-3"
[1] "3-3"
[1] "4-3"
[1] "5-3"
[1] "6-3"
[1] "1-4"
[1] "2-4"
[1] "3-4"
[1] "4-4"
[1] "5-4"
[1] "6-4"

Ответ 2

Использование формул функций (~) немного ограничено, когда вы пытаетесь так гнездиться, так как совершенно неясно, какой уровень map вы пытаетесь установить. (Что ж, это неверно. Мне совершенно ясно, что он ссылается на наизнанку, и поскольку оба они используют одну и ту же номенклатуру, внешние переменные маскируются внутренними переменными.)

Я думаю, что ваш лучший способ обойти это - не использовать метод формулы, вместо этого использовать немедленные/анонимные (или предопределенные) функции:

library(purrr)
str(map(1:2, function(x) map(1:3, function(y) paste(x, y, sep = "-"))))
# List of 2
#  $ :List of 3
#   ..$ : chr "1-1"
#   ..$ : chr "1-2"
#   ..$ : chr "1-3"
#  $ :List of 3
#   ..$ : chr "2-1"
#   ..$ : chr "2-2"
#   ..$ : chr "2-3"

Ответ 3

Просто бегаю через это сейчас.

walk(1:4,~ walk(1:6, ~ print(paste(.x, .y, sep = "-")),.y=.x)) 
[1] "1-1"
[1] "2-1"
[1] "3-1"
[1] "4-1"
[1] "5-1"
[1] "6-1"
[1] "1-2"

а также

purrr::pwalk(expand.grid(1:4,1:6),~print(paste(.x, .y, sep = "-")))
[1] "1-1"
[1] "2-1"
[1] "3-1"
[1] "4-1"
[1] "1-2"

но в соответствии с вашими вложенными циклами точно он возился, и это работает.

for (i in 1:4) {
  for (j in 1:6) {
    print(paste(i, j, sep = "-"))
  }
}
[1] "1-1"
[1] "1-2"
[1] "1-3"
[1] "1-4"
[1] "1-5"
[1] "1-6"
[1] "2-1"

purrr::pwalk(expand.grid(1:6,1:4),~print(paste(.y, .x, sep = "-")))
[1] "1-1"
[1] "1-2"
[1] "1-3"
[1] "1-4"
[1] "1-5"
[1] "1-6"
[1] "2-1"

#or even a map of this
walk(1:4,~ walk(1:6, ~ print(paste(.y, .x, sep = "-")),.y=.x))

Я еще должен выяснить, почему .y=.x в конце, хотя.