графики ggplot в скриптах не отображаются в Rstudio
У меня есть странная проблема с Rstudio: если скрипт вызывает функции ggplot2 для отображения сюжета, то использование Source для запуска сценария не приводит к созданию сюжетов. Если я выбираю весь сценарий с помощью Ctrl+A
, то запускает текущую строку или выделение (Ctrl+Enter
), тогда график действительно отображается. Аналогичным образом, ввод команд построения графика в консоль приводит к правильному выходу.
Например:
library(ggplot2)
p = ggplot(mtcars, aes(wt, mpg))
p + geom_point()
Будет производить вывод только при вставке в консоль, а не если источник.
Есть и другие вопросы по этому поводу, но ни один из них не полезен:- функция ggplot2 ggsave заставляет графическое устройство не отображать графики ложно утверждает, что проблема исправлена в более новых версиях, это не так.
-
в RStudio - ggplot не экономя первого участка при печати и сохранение нескольких участков в скрипте был закрыт как дубликат, но не только это не дубликат, но
dev.off()
решение не работает ("Error in dev.off() : cannot shut down device 1 (the null device)
")
Как могу ли я получить Rstudio для отображения графиков, когда сценарий находится в исходном состоянии? Я использую Rstudio 0.98.1062 и R 3.1.1.
2 ответа:
Решение состоит в явном вызове
print()
объекта ggplot:library(ggplot2) p <- ggplot(mtcars, aes(wt, mpg)) p <- p + geom_point() print(p)
ggplot
функция возвращает объект класса ggplot; ggplot2 работает путем перегрузки функцииВсе хорошо работает в интерактивном режиме, потому что R предполагает, что большинство команд выполняются через функцию
print()
. Это для нашего удобства и позволяет нам набратьrnorm(1)
и получить любой видимый выход. Когда используется команда выполнить текущий выбор (Ctrl+Enter
), RStudio ведет себя так, как если бы каждая выбранная строка была введена в интерактивном режиме и запущена. Вы можете проверить это, проверив историю команд в панелиConsole
после выполнения нескольких выбранных строк.Но этот удобный режим отбрасывается, когда файл читается
source()
. Поскольку эта функция предназначена для запуска (потенциально длинных и дорогостоящих в вычислительном отношении) R-скриптов, нежелательно загрязнять STDOUT низкоприоритетными сообщениями. Вот почемуsource()
по умолчанию выводит только сообщение об ошибке. Если вы хотите чего-то еще, вы должны прямо попросить об этом.