Почему ggplot не отображается при сохранении в переменную? - PullRequest
0 голосов
/ 10 ноября 2018

Я думал, что это было очевидно, но недавно я использовал пакет openair и заметил, что при запуске следующего:

library(openair)
myplot <- windRose(mydata)

график myplot все еще отображается в программе просмотра.После просмотра функции windRose становится очевидным, что вызывается функция plot.

Однако, почему myggplot <- ggplot(mtcars, aes(cyl, mpg)) + geom_point() не дает такого же результата построения графика для зрителя.Я предполагаю, что разница в том, как запрограммированы эти функции, но я не могу легко определить, как ggplot обрабатывает часть построения.

1 Ответ

0 голосов
/ 10 ноября 2018

Это не специфичное для ggplot поведение, а более общий принцип: R REPL не печатает операторы присваивания вообще , тогда как для выражений он вызывает print() или show() в результирующее значение, в зависимости от типа объекта (см. раздел «Автопечать» R Internals для получения подробной информации). Например, 1

> 1 + 1       # expression
[1] 2
> x <- 1 + 1  # assignment
>

Для объекта ggplot вызов print для объекта запускает рендеринг. Так что, если вы не назначаете, он отображается. Например,

> ggplot(mtcars, aes(hp, mpg)) + geom_point()

enter image description here

> g <- ggplot(mtcars, aes(hp, mpg)) + geom_point()
>

Функция plot, с другой стороны, включает в себя рендеринг как часть этого, поэтому другая вызванная вами функция рендерится, несмотря на присваивание.

Обратите внимание, что можно использовать функцию invisible, чтобы временно установить R_Visible в FALSE, что отключает поведение по умолчанию при печати выражений, но все равно подтолкнет полученный результат к .Last.value.

> invisible(1 + 1)
> .Last.value
[1] 2

Однако, поскольку plot() вызывает визуализацию графического устройства как часть его кода, invisible() не остановит его от рендеринга.

> invisible(plot(mtcars$hp, mtcars$mpg))

enter image description here


[1] Кредит @ Грегор

...