5

对于研讨会附带的在线教程,我想强调网格包的使用(尤其是如何使用视口)。为此,我想逐步构建一个情节(即逐块)。在每个步骤/块之间,我想包含一些普通文本,以便更详细地解释每个步骤。

如何告诉 knitr 不要单独评估一个块,而是在前一个块结束的地方开始评估?基本上,我想要添加到前一个块的结果中,而不是对块的新评估。

在下面的代码中,当编织到 html 时,我在 .html 输出中得到 2 个图。第一个显示第一个块的结果(粉红色矩形和一些文本),第二个显示第二个块的结果(蓝色矩形)。我想要实现的是两个图 - 第一个显示第一个块的结果(如上),第二个显示第一个块的结果 + 第二个块的结果(粉红色矩形内的蓝色矩形)。基本上,我想重现在 R 控制台中运行时这两个代码块的行为。蓝色矩形应放在粉色矩形中,不要单独绘制。

这是第一块

```{r grid first vp, tidy = FALSE}
library(grid)
grid.newpage()

## draw a rectangle around the root vp and provide some text
grid.rect()
grid.text("this is the root vp", x = 0.5, y = 1, just = c("centre", "top"))

vp <- viewport(x = 0.5, y = 0.5, 
               height = 0.5, width = 0.5,
               just = c("centre", "centre"))

pushViewport(vp)

grid.rect(gp = gpar(fill = "pink"))
grid.text("this is our first vp", x = 0.5, y = 1, just = c("centre", "top"))
```

然后是一些解释性文字:

“好的,所以现在我们在视口中间创建了一个视root口,x = 0.5并且是原始视口的一半高度和一半宽度y = 0.5——并且。just = c("centre", "centre")height = 0.5width = 0.5

之后我们导航到这个视口 -pushViewport(vp)然后我们绘制了一个填充整个视口的矩形并用粉红色填充它 -grid.rect(gp = gpar(fill = "pink"))

请注意,我们还没有离开视口。这意味着,无论我们现在做什么,都将发生在当前活动的视口(粉红色的视口)中。为了说明这一点,我们将再次重复上面完全相同的代码(我们只会更改填充颜色,以便更好地看到更改)。”

这是第二块

```{r grid second vp, tidy = FALSE}

vp <- viewport(x = 0.5, y = 0.5, 
               height = 0.5, width = 0.5,
               just = c("centre", "centre"))

pushViewport(vp)

grid.rect(gp = gpar(fill = "cornflowerblue"))
```

有什么想法可以告诉 knitr “保留”之前的块中所做的任何事情,并将其作为当前块评估的“起点”吗?

4

2 回答 2

9

它没有记录,但这个功能已经存在了将近一年。要在整个编译过程中保持图形设备打开,您可以设置

opts_knit$set(global.device = TRUE)

我认为很少有人使用此功能,但似乎我错了。

于 2013-07-07T06:20:10.373 回答
0

您可以使用grid.grab()在块末尾捕获场景,将其绘制到新块中,然后导航到最后一个视口(需要命名)。不幸的是,knitr认为grid.grab()应该导致一个新的情节,我不知道如何解决这个问题。

```{r first, tidy = FALSE}
library(grid)
grid.newpage()

## draw a rectangle around the root vp and provide some text
grid.rect()
grid.text("this is the root vp", x = 0.5, y = 1, just = c("centre", "top"))

vp <- viewport(x = 0.5, y = 0.5, 
               height = 0.5, width = 0.5,
               just = c("centre", "centre"), 
               name="first")

pushViewport(vp)

grid.rect(gp = gpar(fill = "pink"))
grid.text("this is our first vp", x = 0.5, y = 1, just = c("centre", "top"))
scene <- grid.grab()
```

```{r second, tidy = FALSE, fig.keep='last'}
grid.draw(scene)
seekViewport("first")
vp <- viewport(x = 0.5, y = 0.5, 
               height = 0.5, width = 0.5,
               just = c("centre", "centre"))

pushViewport(vp)

grid.rect(gp = gpar(fill = "cornflowerblue"))
```

当然,从实际的角度来看,从第一个 chunk 重新运行代码要容易得多,

```{r second, tidy = FALSE}
<<first>>
vp <- viewport(x = 0.5, y = 0.5, 
               height = 0.5, width = 0.5,
               just = c("centre", "centre"))

pushViewport(vp)

grid.rect(gp = gpar(fill = "cornflowerblue"))
```
于 2013-07-06T13:02:20.597 回答