如何判断情节是否完整

时间:2013-08-06 07:25:28

标签: r graphics knitr

更新:我问Paul Murrell(“最终老板”),他告诉我打开新页面的决定是src/library/graphics/src/graphics.c GNewPlot pGEDevDesc GNewPlot(Rboolean recording)

par(mfg)

有效地查看par(new)knitr以决定是否打开新页面。我如何在附加软件包中进行测试?

使用纯R代码或某些C代码的解决方案是可以接受的。


evaluate使用evaluate包来评估R代码块,并捕获结果,包括绘图。简而言之,recordPlot()调用before.plot.new来记录每个代码表达式评估后的当前绘图的快照,以及调用before.grid.newpagepairs()等绘图钩子时的快照(通常这会在绘制新情节之前发生)。对于那些“Luke's”,如果不够清楚,请use the source

制作快照后,我们需要决定是否保留快照,因为在我们评估新表达式后,快照可能不会更改,而新表达式与绘图无关。现在出现了我的问题:当一个图包含子图(例如,基础R图形中的coplot()par(mfrow = c(2, 3))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]layout(matrix(c(1,3,2,3), 2)) plot(rnorm(10)) plot(rnorm(10)) plot(rnorm(10)) 进行比较(正如您在源代码中所见),这在某些情况下运行良好,但并非全部,例如{{3 }}:

mfg

现在我怎么知道第4行之前情节没有完成? {{1}}技巧不再有效。

我一直在寻找这个问题的答案很长一段时间,如果有人可以给我一个提示,我会真的很感激;进一步的细节在上面的两个链接,我可以澄清是否有任何不清楚。我相信必须存在一个解决方案,因为所有R设备都知道何时开始新的绘图屏幕或文件,而不完整的绘图不会触发新的绘图屏幕或文件。

2 个答案:

答案 0 :(得分:5)

更新:现在可以在R 3.0.2中使用。


在他的recent commit中,Paul Murrell在名为par()的{​​{1}}中添加了一个新的只读参数,该参数提供了pageTRUE,表明是否下一个情节需要打开一个新的页面。

这是通过从FALSE复制一些代码来实现的,目前仅在R-devel中可用。

答案 1 :(得分:4)

来自?par

 ‘mfg’ A numerical vector of the form ‘c(i, j)’ where ‘i’ and ‘j’
      indicate which figure in an array of figures is to be drawn
      next (if setting) or is being drawn (if enquiring).  The
      array must already have been set by ‘mfcol’ or ‘mfrow’.

因此,您似乎需要使用pairing functionpar("mfg")[1:2]的初始值分配唯一ID,然后针对该密钥测试par("mfg")[1:2]的后续值。例如,有效配对将是2**par("mfg")[1] * 3**par("mfg")[2]

Pid <- function(ij, test.id=NA){
        mi <- ij[1]
        mj <- ij[2]
        ijd <- 2**mi * 3**mj
        if (!is.na(test.id)) ijd <- ijd == test.id
        return(ijd)
}

回到你的例子:

layout(matrix(c(1,3,2,3), 2))
x0 <- par("mfg")  # 2 1 2 2
id <- Pid(x0)     # 12
plot(rnorm(10))
x1 <- par("mfg")
p1 <- Pid(x1, id) # FALSE (layout is not full)
plot(rnorm(10))
x2 <- par("mfg")
p2 <- Pid(x2, id) # FALSE (layout is not full)
plot(rnorm(10))
x3 <- par("mfg")
p3 <- Pid(x3, id) # TRUE (layout is now full)
#
rbind(p1,p2,p3)
#    [,1]
#p1 FALSE
#p2 FALSE
#p3  TRUE

但是,我想,如果没有最初的id,你就会失去运气。