ggplot的qplot在调用时不会执行源代码。

68
假设我有两个源文件,第一个名为example1.r,第二个名为example2.r(如下所示)。

example1.r

plot(1:10,1:10)

example2.r

qplot(1:10,1:10)

当我运行example1.r时,图形被绘制出来了。但是当我运行example2.r时,却没有绘制出来。这里的解决方案是什么?
(在example2.r中的qplot是ggplot2的函数)
1个回答

80

更新:

  • .R 文件: source 命令的选项 print.eval=TRUE 会导致评估结果的打印行为与交互式命令行中的相同。

source("Script.R", print.eval=TRUE)

  • .Rnw 文件: 默认情况下,knitr 模拟交互式命令行关于 print 的行为。请注意,knitr 可以被指定为 R 包文档的 Sweave 引擎。


这是我的原始答案。但请注意,我认为这个解决方法现在已经完全过时了(而且它一直只适用于一个小懒惰的群体)。

这是著名的FAQ 7.22: 为什么 lattice/trellis 图形不起作用?

对于像 ggplot2 或 lattice 这样的网格图形,您需要打印图形对象才能真正绘制它。

在交互式命令行中,这是自动完成的。在其他任何地方(源文件、循环、函数、Sweave 块内),您需要显式打印它。

print (qplot (1 : 10, 1 : 10))

或者,你可以重新定义qplot来进行打印:

qplot <- function (x, y = NULL, z = NULL, ...) {
  p <- ggplot2::qplot (x = x, y = y, z = z, ...)
  print (p)
}

(这将把轴标签更改为x和y)。

我在想要像用户一样在交互式会话中输入代码的小册子中使用此方法。


小细节:你不需要 invisible(p),因为 print(p) 返回的是 p - Richie Cotton
谢谢Richie,print(p)实际上返回的是invisible(p) - 这正是我想要的(如果它可见,从命令行使用它将会产生两次绘图)。已相应地编辑了代码。 - cbeleites unhappy with SX
谢谢你的回答(+1)!我已经疯了,试图在几个小时内弄清楚这个问题。如果您不介意,我有两个相关的问题:1)重新定义上面显示的qplot()是否能与ggplot2的分层函数很好地配合使用?2)对于其他生成输出的ggplot2函数,是否需要类似的重新定义 - ggplot() - Aleksandr Blekh
2
@AleksandrBlekh:到目前为止,我使用这种方法都很有效。但是我越来越少使用.R文件,而是使用.Rnw文件。我几乎完全改用knitr而不是Sweave,并且knitr默认模拟R命令行的print行为,因此对我来说,答案在很大程度上已经过时了。 - cbeleites unhappy with SX
2
哦,我明白了。是的,如果你使用 ggplot() 而不是 qplot(),你可以并且需要应用相同的策略。 - cbeleites unhappy with SX
显示剩余3条评论

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