我认为这很明显,但最近我使用的是openair
软件包并注意到当我运行以下内容时:
library(openair)
myplot <- windRose(mydata)
情节myplot
仍然在观众中绘制。在查看windRose
函数后,显然正在调用plot
函数。
然而,为什么myggplot <- ggplot(mtcars, aes(cyl, mpg)) + geom_point()
没有与观众密谋相同的结果。我猜不同之处在于这些函数是如何编程的,但我不能轻易确定ggplot如何处理绘图部分。
这不是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