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

Использование функции png не работает при вызове внутри функции

У меня есть функция, которая делает вещи, а затем графики, основанные на условии:

f <- function(n) {
  rand <- rnorm(n)
  no   <- seq_len(n)
  df   <- data.frame(no=no, rand=rand)
  if (n > 10) {
    png("plot.png")
    p <- ggplot(df)
    p + geom_point(aes(x=no, y=rand))
    dev.off()
  }
}

f(11)

Я получаю пустой файл png в конце этого. Что здесь происходит?

4b9b3361

Ответ 1

Из ответов здесь представлены два решения:

library(ggplot2)
f <- function(n) {
  rand <- rnorm(n)
  no   <- seq_len(n)
  df   <- data.frame(no=no, rand=rand)
  if (n > 10) {
    png("plot.png")
    print({
      p <- ggplot(df)
      p + geom_point(aes(x=no, y=rand))
    })
    dev.off()    
  }
}

f(11)

Примечание. Я знал, что мне нужно использовать print(), но способ, которым я это пробовал, не работал, потому что он не был помещен в нужное место.

Кроме того, я ранее использовал параметр ggsave, но это тоже не сработало. Конечно, теперь это работает. Он также, кажется, имеет лучшее разрешение, чем использование png():

library(ggplot2)
f <- function(n) {
  rand <- rnorm(n)
  no   <- seq_len(n)
  df   <- data.frame(no=no, rand=rand)
  if (n > 10) {
    p <- ggplot(df)
    p + geom_point(aes(x=no, y=rand))
    ggsave(file="plot.png")
  }
}

f(11)

Спасибо всем.

Ответ 2

Я только что узнал на другом сайте (ссылка приведена ниже). В цикле вы должны явно использовать функцию печати, чтобы функция jpeg(), png() работала. В исходном посте вы можете просто добавить строку печати (p).

  if (n > 10) {
        png("plot.png")
        p <- ggplot(df)
        p + geom_point(aes(x=no, y=rand))
        print(p)
        dev.off()
    }

В приведенной ниже ссылке это дает хорошее объяснение этому https://stat545-ubc.github.io/block017_write-figure-to-file.html#despair-over-non-existent-or-empty-figures