我认为这很明显,但是最近我使用了openair
软件包,并注意到在运行以下代码时:
library(openair)
myplot <- windRose(mydata)
图myplot
仍在查看器中绘制。看完windRose
函数后,很明显plot
函数被调用。
但是,为什么myggplot <- ggplot(mtcars, aes(cyl, mpg)) + geom_point()
在绘制给观察者时没有相同的结果。我猜想区别在于这些函数的编程方式,但是我不能轻易确定ggplot如何处理绘图部分。
答案 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
> 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()
[1] 信用@Gregor