Присвоение элементов списку на вложенной карте мурлыканья

Я пытаюсь назначить элементы списку в вызове purstr::map гнезда - это должно быть в основном то же самое, что и вложенный цикл for:

res <- list()
for (i in 1:4) {
  for (j in letters[1:3]) {
    res[[paste(i,j)]] <- paste(i,j)
  }
}

str(res)
#> List of 12
#>  $ 1 a: chr "1 a"
#>  $ 1 b: chr "1 b"
#>  $ 1 c: chr "1 c"
#>  $ 2 a: chr "2 a"
#>  $ 2 b: chr "2 b"
#>  $ 2 c: chr "2 c"
#>  $ 3 a: chr "3 a"
#>  $ 3 b: chr "3 b"
#>  $ 3 c: chr "3 c"
#>  $ 4 a: chr "4 a"
#>  $ 4 b: chr "4 b"
#>  $ 4 c: chr "4 c"

Однако, когда я пытаюсь преобразовать это в purrrрезультаты выводятся на консоль, но никогда не сохраняются в объекте списка res_purrr?

library(purrr)
res_purrr <- list()

map(1:4, function(i)
  map(letters[1:3], function(j)
    res_purrr[[paste(i,j)]] <- paste(i,j)
  )
)

res_purrr
#> list()

Запуск того же кода с walk возвращает тот же пустой res_purrr объект.

2 ответа

Решение

Я бы сделал следующее:

library(purrr)
res_purrr <- expand.grid(1:4,letters[1:3],stringsAsFactors = FALSE) %>%
  pmap(paste) %>%
  set_names()
str(res_purrr)
# List of 12
# $ 1 a: chr "1 a"
# $ 2 a: chr "2 a"
# $ 3 a: chr "3 a"
# $ 4 a: chr "4 a"
# $ 1 b: chr "1 b"
# $ 2 b: chr "2 b"
# $ 3 b: chr "3 b"
# $ 4 b: chr "4 b"
# $ 1 c: chr "1 c"
# $ 2 c: chr "2 c"
# $ 3 c: chr "3 c"
# $ 4 c: chr "4 c"

Этот вопрос является актуальным: эквивалент карты purrr вложенного цикла for

Используя ваш код, мы можем просто добавить res_purr <-

res_purrr <- map(1:4, function(i)
  map(letters[1:3], function(j)
    res_purrr[[paste(i,j)]] <- paste(i,j)
  )
)
str(res_purrr)  
# List of 4
# $ :List of 3
# ..$ : chr "1 a"
# ..$ : chr "1 b"
# ..$ : chr "1 c"
# ...

редактировать

Если вопрос был о воспроизведении res в отличие от неспособности сохранить результат mapвот как (похожий, но) альтернативный подход к ответу @Moody_Mudskipper:

x <- do.call(paste, expand.grid(1:3, letters[1:4], stringsAsFactors = FALSE))
res <- setNames(as.list(x), x)
str(res)  
# List of 12
# $ 1 a: chr "1 a"
# $ 2 a: chr "2 a"
# ...

А вот с пользовательской функцией вместо paste

x <- do.call(function (Var1,Var2) paste(sqrt(Var1),toupper(Var2)), 
             expand.grid(1:4, letters[1:3], stringsAsFactors = FALSE))
res <- setNames(as.list(x), x)
str(res) 
# List of 12
# $ 1 A               : chr "1 A"
# $ 1.4142135623731 A : chr "1.4142135623731 A"
# $ 1.73205080756888 A: chr "1.73205080756888 A"
# $ 2 A               : chr "2 A"
# ...
Другие вопросы по тегам