将连续的控制台输出合并为一个块

时间:2014-03-05 04:16:30

标签: r knitr rstudio

在RStudio中编织R-Markdown时,我希望将一个块中的所有控制台输出放在一个代码块中。怎么办呢?

作为一种解决方法,我编写两个相同代码的代码块,并在第一个块上设置eval=FALSE,在第二个块上设置echo=FALSE

```{r Vector Demo 2, eval=FALSE}
# examine the class and structure of vectors
class(nums)
class(char)
str(nums)
str(char)
```
```{r Vector Demo 2b, echo=FALSE}
# examine the class and structure of vectors
class(nums)
class(char)
str(nums)
str(char)
```

然而,这会产生以下输出:

# examine the class and structure of vectors
class(nums)
class(char)
str(nums)
str(char)
## [1] "numeric"
## [1] "character"
##  num [1:5] 1 2 3 4 5
##  chr [1:3] "A" "B" "C"

我想要的是将第二个块的输出(即Vector Demo 2b)放在一个代码块中,就像第一个块一样(即Vector Demo 2)。
这是我希望得到结果的示例输出:

# examine the class and structure of vectors
class(nums)
class(char)
str(nums)
str(char)
## [1] "numeric"
## [1] "character"
##  num [1:5] 1 2 3 4 5
##  chr [1:3] "A" "B" "C"

赏金猎人的注意事项:
更好的是,我要感谢一种方法,让一个代码块首先打印输入代码,然后打印输出代码。这样我就可以避免重复以及随之而来的可能的不一致。

3 个答案:

答案 0 :(得分:8)

这是您的问题的解决方案。有两件事要做:

## Test


```{r echo = F, cache = F}
knitr::knit_hooks$set(document = function(x){
  gsub("```\n*```r*\n*", "", x)
})
```

```{r VectoDemo, results = 'hold'}
nums = 1:5
char = LETTERS[1:5]
# examine the class and structure of vectors
class(nums)
class(char)
str(nums)
str(char)
```

我在这里做了两件事

  1. 在打印信号源后,将results = 'hold'设置为“保持”打印输出。
  2. 添加了一个文档挂钩,用于折叠连续的代码块,中间没有文本。

答案 1 :(得分:2)

使用knitr >= 1.5.23

您可以从内置编织选项中获得更多变化。

例如......使用collapse=TRUE, results="hold"获得与Ramnath的钩子相同的结果(不需要全局文档钩子)。

如果你真的想要不同的源/输出部分,如问题所示,那么你已经走在了正确的道路上。只需使用chunk reuse即可获得输出组合,而无需重复自己......

```{r}
nums <- 1:5
char <- LETTERS[1:3]
```

```{r "Vector Demo", eval=FALSE}
# examine the class and structure of vectors
class(nums)
class(char)
str(nums)
str(char)
```

```{r "Vector Demo", echo=FALSE}
```

最后一个块是您的基本chunk reuse模式。

您可以看到各种基本组合here

由于您没有编写knitr教程,请忽略source并使用rendered示例。

答案 2 :(得分:1)

@ Ramnath的解决方案看起来比这个简单一点。他在许多(大多数?)情况下可能会更好,但这种替代解决方案在其他方面可能会更好:

Test.

```{r echo=F,cache=F}
knitr::knit_hooks$set(document=function(x) {
    paste(rapply(strsplit(x, '\n'), function(y) Filter(function(z) !grepl('# HIDEME',z),y)), collapse='\n')
})
```

```{r Vector Demo 1, results='hold', tidy=FALSE}
nums = 1:5
chars = LETTERS[1:5]
# examine the class and structure of vectors
{ # HIDEME
print(class(nums))
print(class(chars))
str(nums)
str(chars)
} # HIDEME
```

注意:

  1. 在代码周围使用括号({})可以将输出保持在一起。但是,返回事物而不打印事物的命令将是静默的(除非是最后一次),而是print这些行的补充。根据您的实际命令,这可能是也可能不是因素。

  2. 在我的安装中,出于某种原因,tidy默认为TRUE,这会将我的第一个# HIDEME评论转移到左括号之前(之后我编辑为代码)反映numschars的定义。奇怪,但可能是源整理的副作用。这就是我强迫tidy=FALSE的原因。由于这可能会影响您呈现代码的方式,因此将其用作每个块选项至少会限制漂亮的打印问题。

  3. # HIDEME实际上只是“评论字符加上一些晦涩的字符串”,方便grep

  4. 我添加的knit_hook不是“简单”,但我发现它不太可能对文档中的其他块产生副作用。这可能更具特异性(我知道@Ramnath已经解决了Yihui的其他knitr问题,所以可以有更多“正确”的方法来更具特异性地做到这一点。)(我试过但没有做到这是一个“输出”钩子,而不是“文件”钩子。作业。)