2013-08-29 65 views
6

當我使用knitr建立HTML文檔進行下面的代碼的:防止knitr/Rmarkdown從與碼交織塊輸出

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') 

``` 

I get output其中chunk1代碼插入相鄰的cat語句的輸出。有趣的是,for循環內的輸出作爲單個塊輸出。

我寧願所有的代碼chunk1chunk1第一次出現,所有的輸出的緊隨其後。有沒有辦法讓Rmarkdown/knitr避免目前正在進行的更細粒度的交織?

+0

不太得到你想要的東西,但你可以讓2塊代碼是相同的,一個在那裏你'EVAL = FALSE'和第二,你'回聲= FALSE'。 –

+0

我可以做到這一點。或者我可以在'for(x in 1)'中包裝塊的內容,這使得Rmarkdown不會交織輸出(以我的文檔中的多餘代碼爲代價)。但我寧願有一個選擇,以正確的方式做到這一點。任何人都知道是否有可能? – Harlan

+1

@Harlan我不認爲這很容易,因爲knitr處理這些塊的方式。最簡單的方法就是將代碼塊放到{@} – hadley

回答

8

這是我提出的

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') 
```