更新:我问了 Paul Murrell(“最终老板”),他告诉我打开新页面的决定是由以下人员做出src/library/graphics/src/graphics.c
的GNewPlot
:
pGEDevDesc GNewPlot(Rboolean recording)
它有效地查看par(mfg)
并par(new)
决定是否打开一个新页面。我如何在附加包中进行测试?
使用纯R代码或某些 C 代码的解决方案是可以接受的。
knitr
使用该evaluate
包评估 R 代码块,并捕获结果,包括绘图。简而言之,在对每个代码表达式求值后evaluate
调用recordPlot()
记录当前绘图的快照,以及在调用before.plot.new
和before.grid.newpage
调用绘图钩子时(通常这发生在绘制新绘图之前)。对于那些“卢克”,如果不够清楚,请使用来源。
在我们制作快照后,我们需要决定是否保留它,因为在我们评估一个新的表达式后,快照可能不会改变,这与绘图无关。现在我的问题来了:当一个图包含子图(例如,,,pairs()
或coplot()
在par(mfrow = c(2, 3))
基本 R 图形中)时,我们不应该保留不完整的快照。在下面的示例中,应丢弃前三个图:
par(mfrow = c(2, 2))
plot(rnorm(10))
plot(rnorm(10))
plot(rnorm(10))
plot(rnorm(10))
为了实现这一点,我们比较par("mfg")[1:2]
(par("mfg")[3:4]
如您在源代码中看到的),这在某些情况下效果很好,但不是全部,例如问题 #25:
layout(matrix(c(1,3,2,3), 2))
plot(rnorm(10))
plot(rnorm(10))
plot(rnorm(10))
现在我怎么知道情节在第 4 行之前不完整?这个mfg
伎俩不再奏效。
我一直在寻找这个问题的答案,如果有人能给我提示,我将不胜感激;更多详细信息在上面的两个链接中,如果有任何不清楚的地方,我可以澄清一下。我相信必须存在一个解决方案,因为所有 R 设备都知道何时开始新的绘图屏幕或文件,不完整的绘图不会触发新的绘图屏幕或文件。