在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"
赏金猎人的注意事项:
更好的是,我要感谢一种方法,让一个代码块首先打印输入代码,然后打印输出代码。这样我就可以避免重复以及随之而来的可能的不一致。
答案 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)
```
我在这里做了两件事
results = 'hold'
设置为“保持”打印输出。答案 1 :(得分:2)
您可以从内置编织选项中获得更多变化。
例如......使用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
```
注意:
在代码周围使用括号({
和}
)可以将输出保持在一起。但是,返回事物而不打印事物的命令将是静默的(除非是最后一次),而是print
这些行的补充。根据您的实际命令,这可能是也可能不是因素。
在我的安装中,出于某种原因,tidy
默认为TRUE
,这会将我的第一个# HIDEME
评论转移到左括号之前(之后我编辑为代码)反映nums
和chars
的定义。奇怪,但可能是源整理的副作用。这就是我强迫tidy=FALSE
的原因。由于这可能会影响您呈现代码的方式,因此将其用作每个块选项至少会限制漂亮的打印问题。
# HIDEME
实际上只是“评论字符加上一些晦涩的字符串”,方便grep
。
我添加的knit_hook
不是“简单”,但我发现它不太可能对文档中的其他块产生副作用。这可能更具特异性(我知道@Ramnath已经解决了Yihui的其他knitr
问题,所以可以有更多“正确”的方法来更具特异性地做到这一点。)(我试过但没有做到这是一个“输出”钩子,而不是“文件”钩子。作业。)