R 将连续控制台输出合并到一个块中

R 将连续控制台输出合并到一个块中,r,knitr,rstudio,R,Knitr,Rstudio,在RStudio中编织R标记时,我希望将一个块中的所有控制台输出放在一个代码块中。如何做到这一点 作为一种解决方法,我编写了两个相同代码的代码块,并在第一个块上设置eval=FALSE,在第二个块上设置echo=FALSE `{r向量演示2,eval=FALSE} #检查向量的类和结构 类别(nums) 类(字符) str(nums) str(字符) ``` ```{r向量Demo 2b,echo=FALSE} #检查向量的类和结构 类别(nums) 类(字符) str(nums) str(字符

在RStudio中编织R标记时,我希望将一个块中的所有控制台输出放在一个代码块中。如何做到这一点

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

`{r向量演示2,eval=FALSE}
#检查向量的类和结构
类别(nums)
类(字符)
str(nums)
str(字符)
```
```{r向量Demo 2b,echo=FALSE}
#检查向量的类和结构
类别(nums)
类(字符)
str(nums)
str(字符)
```
但是,这会产生以下输出:

# 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) 我希望第二个块(即向量Demo 2b)的输出像第一个块(即向量Demo 2)一样放在一个代码块中。
这是我希望获得结果的示例输出:

赏金猎人须知:

更好的是,我会很感激有一种方法,让一个代码块先打印输入代码,然后打印输出代码。这样我就可以避免重复和可能出现的不一致。

以下是解决您问题的方法。有两件事要做:

## 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'
    设置为在打印源文件后“hold”打印输出
  • 添加了一个文档挂钩来折叠连续的代码块,中间没有文本

  • @Ramnath的解决方案似乎比这个简单一些。His在许多(大多数?)情况下可能更好,但这种替代解决方案在其他情况下可能更好:

    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
    注释移到左括号之前(此后我编辑为code,以反映
    nums
    chars
    的定义)。奇怪,但可能是源清理的副作用。这就是为什么我强制
    tidy=FALSE
    。由于这可能会影响代码的显示方式,因此将其用作每块选项至少可以限制漂亮的打印问题

  • #HIDEME
    实际上只是“注释字符加上一些模糊字符串”,以便于
    grep
    ing

  • 我添加的
    knit_hook
    并不“简单”,但我发现它不太可能对文档中的其他块产生副作用。这可能需要更具体的说明(我知道@Ramnath已经解决了Yihui的其他
    knitr
    问题,因此可以有更“正确”的方法来更具体地完成这项工作。)(我尝试过,但没有通过“输出”钩子而不是“文档”钩子来完成。家庭作业。)

  • 您可以从内置的knitr选项中获得相当多的变化

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

    如果您确实希望如问题所示的不同源/输出部分,那么您已经走上了正确的道路。只需使用
    块重用
    即可获得输出组合,而无需重复自己的操作

    ```{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}
    ```
    
    `{r}
    
    谢谢。它现在的工作情况和预期的一样。不过,我还得等一段时间才能颁发赏金。@AlexEssilfie这基本上是存储库中的一个文件。在knitr的下一个版本中,您将使用
    collapse
    选项以降价方式折叠输出,正如Thell在其回答中指出的那样。您的结果与@Ramnath的结果不同,这在latex/html代码检查和目视检查中是显而易见的。两种解决方案都不提供OP请求的代码分组和输出;在您的两个建议中,输出仍然按命令行单独分组,而不是分组在一个html“代码”或latex“着色”/“逐字”块中。虽然我确实喜欢更简单的代码,但它不能满足OP的要求。(我仍然不认为我的代码非常优雅,尽管我认为它是唯一符合要求格式的代码。)如果我遗漏了什么,请帮助我理解。我真的很喜欢你提供的rpubs链接,顺便说一句,做得不错,并演示了不同的选项组合。我并不是在所有渲染上都得到相同的结果;虽然我发现在其中遵循CSS/JS有点困难,但渲染结果非常平滑。谢谢,我会参考一下你的rpubs页面!也许是pandoc产生了不同的结果。每个输出位于单独的
    块中。我同意Ramnath的解决方案有点具体,不安全,我的解决方案不太安全。以
    块的形式显示每次运行的结果(分别完成,然后合并)。(pandoc 1.12.3,knitr 1.5;使用
    pandoc(knit('file.Rmd'))
    ;类似地使用
    format='latex'
    ,用于pdf比较,未显示。)很明显,此时我没有使用rmarkdown(也没有使用rstudio,尽管我认为这并不重要),所以这几乎肯定是
    render()
    (来自rmarkdown)和
    pandoc()
    (来自knitr)。也许Alex应该考虑一下他使用的是什么(他列出了“R-Markdown”,我认为它是格式,不一定是包)。与
    collapse=TRUE
    没有区别。我使用的是knitr-1.5和pandoc-1.12.3。 # 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"
    
    ## 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)
    ```
    
    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
    ```
    
    ```{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}
    ```