防止knitr/Rmarkdown与代码交错块输出

防止knitr/Rmarkdown与代码交错块输出,r,markdown,knitr,r-markdown,R,Markdown,Knitr,R Markdown,当我使用knitr用以下代码构建HTML文档时: Chunk Output ======================================================== Outside a chunk. ```{r chunk1, results='asis'} cat('Inside a chunk\n\n') for (i in 1:3) { cat('* Inside loop #', i, '\n') } cat('Outside a loop, b

当我使用knitr用以下代码构建HTML文档时:

Chunk Output
========================================================

Outside a chunk.

```{r chunk1, results='asis'}

cat('Inside a chunk\n\n')

for (i in 1:3) {
    cat('* Inside loop #', i, '\n')
}

cat('Outside a loop, but still inside the first chunk')
```

Between chunks.

```{r chunk2, results='asis'}

cat('Inside second chunk')

```
其中
chunk1
中的代码与
cat
语句的输出交错。有趣的是,
for
循环中的输出作为单个块输出


我希望先显示
chunk1
中的所有代码,然后显示
chunk1
中的所有输出。有没有办法让Rmarkdown/knitr避免它目前正在进行的更细粒度的交织

以下是我提出的解决方案

Chunk Output
========================================================

Outside a chunk.

```{r chunk1, results='hide'}

cat('Inside a chunk\n\n')

for (i in 1:3) {
    cat('* Inside loop #', i, '\n')
}

cat('Outside a loop, but still inside the first chunk')
```

```{r ref.label = 'chunk1', results = 'asis', echo = F}

```
在最新版本的knitr中,@yihui添加了一个新的区块选项
results=“hold”
,该选项自动将所有输出的打印保留到最后。因此,我们可以只写

Chunk Output
========================================================

Outside a chunk.

```{r chunk1, results='hold'}

cat('Inside a chunk\n\n')

for (i in 1:3) {
    cat('* Inside loop #', i, '\n')
}

cat('Outside a loop, but still inside the first chunk')
```

没有完全得到你想要的,但你可以制作两个相同的代码块,一个是你
eval=FALSE
,另一个是你
echo=FALSE
@Harlan我认为这并不容易,因为knitr处理这些代码块的方式。一个最简单的方法是将块放在
{}
中,在这里,您可以使用
results='hide'
来抑制输出,并使用
echo=F,results=“asis”
添加一个依赖块。您可能会提交一个名为
results=“hold”
的选项的功能请求,就像
fig.show=“hold”
一样,它会自动为结果执行此操作,因为似乎有一些用于此的用例。听到功能请求,代码就完成了。这是最好的客户服务@Yihui!