在Rstudio中,脚本中的ggplot绘图无法显示。

112

我在Rstudio中遇到了一个奇怪的问题:如果脚本调用ggplot2函数来显示绘图,则使用源代码运行脚本不会生成绘图。如果我选择整个脚本并使用Ctrl+A,然后运行当前行或所选内容Ctrl+Enter),则绘图显示。同样,将绘图命令键入控制台会产生正确的输出。

例如:

library(ggplot2)

p = ggplot(mtcars, aes(wt, mpg))
p + geom_point()

只有在控制台中粘贴时才会输出,而不是在源代码中。

这方面有其他问题,但都没有帮助:

如何让Rstudio在脚本被源代码调用时显示图形?我使用的是Rstudio 0.98.1062和R 3.1.1。

5个回答

154

解决方法是在 ggplot 对象上显式调用 print() 函数:

library(ggplot2)

p <- ggplot(mtcars, aes(wt, mpg))
p <- p + geom_point()
print(p)

ggplot函数返回ggplot类的对象;ggplot2通过重载print函数,在ggplot类对象上表现出不同的行为- 它不会将它们打印到STDOUT,而是创建图表。

在交互模式下一切都工作得很好,因为R假定大多数命令是通过print()函数运行的。这是为了我们的方便,使我们能够键入rnorm(1)并获得任何可见输出。当使用"运行当前选择"命令(Ctrl+Enter)时,RStudio会像在交互模式下输入和运行每个选定行一样。运行几条选择的行后,您可以通过检查Console窗格中的命令历史记录来验证这一点。

但是,当文件被source()读取时,这种方便的模式被放弃了。由于这个函数旨在运行(可能长时间且计算昂贵的)R脚本,将STDOUT污染为低优先级消息是不可取的。这就是为什么source()默认只输出错误消息。如果您想要其他内容,则必须明确要求。


2
天啊...我讨厌所有这些教程网站甚至不提到你必须调用print。太愚蠢了。来源:https://datacarpentry.org/R-ecology-lesson/04-visualization-ggplot2.html - NoName
1
@NoName 我完全同意你的观点。同时,我不赞成设计规范中将“print”作为必要条件的做法。 - Peter Leopold

24

虽然这是一个相当老的问题,但我遇到了同样的问题,并找到了一个快速解决方案,如果你想在R Studio编辑框中使用“source”按钮。

你只需要简单地打开“带有回显的源代码”选项(Ctrl + Shift + Enter),就可以像预期的那样显示图形。


1
太好了,我不知道这个!这很好地补充了@Mirosław Zalewski所给出的解释。 - Uwe

12

我最近看到这个问题,并意识到最新的方法是在创建图表后调用show(p)


你有任何来源证明这是最新的方法吗?我只能找到这个:https://ggplot2.tidyverse.org/reference/print.ggplot.html - Chris

7

我在搜索类似问题(在RStudio中无法显示绘图)时找到了这个问题。 我试图通过分步运行一个复杂的ggplot2块来进行故障排除,但无法在绘图窗口中显示任何内容。

原因:我之前打开的tiff()函数没有关闭。

解决方案:我运行了几次dev.off()直到所有之前的tiff()函数都完成,然后我才能在RStudio中创建图形并查看结果。


谢谢 Tania,你帮我省去了重新启动的麻烦... :-) - StuvdG

0
另一个选项是简单地使用plot()。在Rstudio中点击“源代码”,它会在窗口中显示绘图如下:
library(ggplot2)

p = ggplot(mtcars, aes(wt, mpg))
p = p + geom_point()
plot(p) 

# This pops when clicking on Source
source("~/.active-rstudio-document")

输出:

enter image description here


我发现'plot()'不接受/识别'ggproto对象'作为输入!! - Roberto Scotti

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接