Использование функции png не работает при вызове внутри функции - PullRequest
20 голосов
/ 09 февраля 2012

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

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 в конце этого. Что здесь происходит?

Ответы [ 2 ]

17 голосов
/ 10 февраля 2012

Исходя из ответов, есть два решения:

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)

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

10 голосов
/ 31 марта 2016

Я только что узнал с другого сайта (ссылка предоставлена ​​ниже). В цикле вы должны явно использовать функцию печати, чтобы заставить работать функции 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 фигура к file.html # отчаивайтесь-над-несуществующим или опорожнением-цифра

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...