为什么在存储到变量时ggplot无法绘图?

时间:2018-11-10 01:03:18

标签: r ggplot2 plot read-eval-print-loop

我认为这很明显,但是最近我使用了openair软件包,并注意到在运行以下代码时:

library(openair)
myplot <- windRose(mydata)

myplot仍在查看器中绘制。看完windRose函数后,很明显plot函数被调用。

但是,为什么myggplot <- ggplot(mtcars, aes(cyl, mpg)) + geom_point()在绘制给观察者时没有相同的结果。我猜想区别在于这些函数的编程方式,但是我不能轻易确定ggplot如何处理绘图部分。

1 个答案:

答案 0 :(得分:4)

这不是特定于ggplot的行为,而是更笼统的原则: R REPL不会一般显示打印赋值语句,而对于表达式,它将调用print()或{ {1}}取决于对象类型(有关详细信息,请参见Autoprinting section of R Internals)。例如, 1

show()

对于ggplot对象,在对象上调用> 1 + 1 # expression [1] 2 > x <- 1 + 1 # assignment > 会触发渲染。因此,如果您不分配,它将被渲染。例如,

print

enter image description here

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

另一方面,> g <- ggplot(mtcars, aes(hp, mpg)) + geom_point() > 函数包括渲染作为它的一部分,这就是为什么您调用的另一个函数尽管已分配也被渲染的原因。

请注意,您可以使用plot函数将invisible临时设置为R_Visible,这将关闭打印表达式的默认行为,但仍会将评估结果推入{{ 1}}。

FALSE

但是,由于.Last.value作为其代码的一部分调用图形设备的渲染,因此> invisible(1 + 1) > .Last.value [1] 2 不会阻止其渲染。

plot()

enter image description here


[1] 信用@Gregor