为什么ggplot在存储到变量时不会绘制?

问题描述 投票:1回答:1

我认为这很明显,但最近我使用的是openair软件包并注意到当我运行以下内容时:

library(openair)
myplot <- windRose(mydata)

情节myplot仍然在观众中绘制。在查看windRose函数后,显然正在调用plot函数。

然而,为什么myggplot <- ggplot(mtcars, aes(cyl, mpg)) + geom_point()没有与观众密谋相同的结果。我猜不同之处在于这些函数是如何编程的,但我不能轻易确定ggplot如何处理绘图部分。

r ggplot2 plot read-eval-print-loop
1个回答
4
投票

这不是ggplot特定的行为,而是更一般的原则:R REPL一般不打印赋值语句,而对于表达式,它根据对象类型调用结果值上的print()show()(参见Autoprinting section of R Internals for细节)。例如,1

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

对于ggplot对象,在对象上调用print会触发渲染。因此,如果您不分配,它将被渲染。例如,

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

> 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))


[1]信用@Gregor

© www.soinside.com 2019 - 2024. All rights reserved.