Output map vs for

Estou com uma dúvida comparando um map com um for.

v1 <- c('a', 'b', 'c')
v2 <- c(1, 2, 3)

map(1:3, ~assign(v1[[.x]], v2[[.x]]))

for (i in 1:3) {
  assign(v1[[i]], v2[[i]])
}

O output desse map não deveria ser 3 objetos, a, b e c? Ele me retorna uma lista em vez de 3 objetos separados. O for funciona do jeito que eu esperava, como decrevi acima.

Output do map:

> map(1:3, ~assign(v1[[.x]], v2[[.x]]))
[[1]]
[1] 1

[[2]]
[1] 2

[[3]]
[1] 3

Obrigado!

Rodrigo, perceba que a função assign() retorna o seu segundo argumento. A saída que você está recebendo do map() são os elementos de v2 mas em forma de lista (pois esse é o formato da saída do map(), sempre uma lista). Veja no exemplo abaixo que, de fato, a saída dos dois comandos são consistentes:

library(purrr)

v1 <- c('a', 'b', 'c')
v2 <- c(1, 2, 3)

map(1:3, ~assign(v1[[.x]], v2[[.x]]))
#> [[1]]
#> [1] 1
#> 
#> [[2]]
#> [1] 2
#> 
#> [[3]]
#> [1] 3

v1 <- c('a', 'b', 'c')
v2 <- c(1, 2, 3)

for (i in 1:3) {
  print(assign(v1[[i]], v2[[i]]))
}
#> [1] 1
#> [1] 2
#> [1] 3

Created on 2020-07-10 by the reprex package (v0.3.0)

Se me permite a curiosidade, para quê você está usando um assign() dentro de um map()? Esse padrão é altamente perigoso e provavelmente posso te ajudar a encontrar uma solução melhor.

2 curtidas

Brigado, Caio. Eu tinha esquecido como funcionava esse output do map.

Eu estava mexendo com um excel com várias abas, e tava usando o assign() pra criar um tibble pra cada aba, associando cada tibble com a respectiva aba.

Com a sua resposta eu percebi que não precisava, então ta tudo certo haha.

Valeu!