Exportar gráficos que estão dentro de lista utilizando loop

Boa tarde pessoal, estou trabalhando com vários gráficos que estão salvos dentro de uma lista. Eu precisava salvar cada um deles com o ggsave, mas como são mais de 30, pensei em fazer um loop. Esse loop chega até a salvar os arquivos na minha pasta mas eles não contêm o gráfico, aparece um arquivo em branco. O que posso estar deixando passar?
Segue um exemplo reprodutível.
Agradeço desde já a ajuda :slight_smile:

library(ggplot2)
df <- data.frame(x = c(1,2,3), y = c(4,5,6))

g1 <- ggplot(df, aes(x = x, y = y)) + geom_point()
g2 <- ggplot(df, aes(x = y, y = x)) + geom_point()

list <- list(graf1 = g1, graf2 = g2)
list_names <- names(list)

for (i in list_names) {
  temp <- list$i
  ggsave(
    filename = paste0(i,".png"),
    plot = temp,
    device = "png",
    width = 12,
    height = 6,
    dpi = 300)
}

Created on 2022-09-01 with reprex v2.0.2

Oi Laila, tudo bem?

Obrigada por postar um exemplo reprodutível!

Acredito que o que está causando o erro é algo pequeno: a forma de selecionar o elemento da lista.

Imagina que estamos dentro do for, e i recebe o texto "graf1".
Quando você usa list$i para acessar a imagem do gráfico, acaba sendo list$"graf1", com o texto, e ele não acha nada (retorna NULL):

i <- list_names[1]
i
#> [1] "graf1"

temp <- list$i
temp
#> NULL

O que podemos fazer é: em vez de usar $ para selecionar o elemento da lista, usar colchetes duplos, pois ele recebe os textos adequadamente para obter um elemento da lista:

i <- list_names[1]
i
#> [1] "graf1"

temp <- list[[i]]
temp

Código com a alteração:

library(ggplot2)
df <- data.frame(x = c(1,2,3), y = c(4,5,6))

g1 <- ggplot(df, aes(x = x, y = y)) + geom_point()
g2 <- ggplot(df, aes(x = y, y = x)) + geom_point()

list <- list(graf1 = g1, graf2 = g2)
list_names <- names(list)

for (i in list_names) {
  temp <- list[[i]]
  ggsave(
    filename = paste0(i,".png"),
    plot = temp,
    device = "png",
    width = 12,
    height = 6,
    dpi = 300)
}

Não sei se ficou claro, mas, se não ficou, me avise!

1 curtida

Oi Bea, funcionou perfeitamente! Muito obrigada! Tenho que me acostumar mais com listas :smile:

1 curtida