18

更新:我问了 Paul Murrell(“最终老板”),他告诉我打开新页面的决定是由以下人员做出src/library/graphics/src/graphics.cGNewPlot

pGEDevDesc GNewPlot(Rboolean recording)

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

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


knitr使用该evaluate包评估 R 代码块,并捕获结果,包括绘图。简而言之,在对每个代码表达式求值后evaluate调用recordPlot()记录当前绘图的快照,以及在调用before.plot.newbefore.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 设备都知道何时开始新的绘图屏幕或文件,不完整的绘图不会触发新的绘图屏幕或文件。

4

2 回答 2

5

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


在他最近的提交par()中,Paul Murrell 在named中添加了一个新的只读参数page,它给出了TRUEor FALSE,表示下一个情节是否需要打开一个新页面。

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

于 2013-08-27T01:29:37.513 回答
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’.

因此,您似乎需要使用配对函数将唯一 id 分配给 的初始值par("mfg")[1:2],然后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,您将不走运。

于 2013-08-06T18:45:06.853 回答