【问题标题】:Merge consecutive console outputs into one block将连续的控制台输出合并到一个块中
【发布时间】:2014-03-05 04:16:29
【问题描述】:

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

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

# 检查向量的类和结构
班级(人数)
类(字符)
字符串(数字)
字符串(字符)
## [1] "numeric"
## [1] "character"
##  num [1:5] 1 2 3 4 5
##  chr [1:3] "A" "B" "C"

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

# 检查向量的类和结构
班级(人数)
类(字符)
字符串(数字)
字符串(字符)
## [1] "numeric"
## [1] "character"
##  num [1:5] 1 2 3 4 5
##  chr [1:3] "A" "B" "C"

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

【问题讨论】:

    标签: r knitr rstudio


    【解决方案1】:

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

    ## 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. 添加了一个文档挂钩来折叠连续的代码块,中间没有文本。

    【讨论】:

    • 谢谢。它现在按预期工作。不过,我将不得不等待一段时间才能获得赏金。
    • @AlexEssilfie 这基本上是knitr-examples 存储库中的previous example。正如 Thell 在他的回答中指出的那样,在下一个 knitr 版本中,您将拥有 collapse 选项来折叠 Markdown 中的输出。
    【解决方案2】:

    knitr >= 1.5.23

    您可以从内置的 knitr 选项中获得相当多的多样性。

    例如...使用 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 示例。

    【讨论】:

    • 您的结果与@Ramnath 的不同,这在检查乳胶/html 代码和目视检查时很明显。两种解决方案都没有提供 OP 请求的输出代码分组;在您的两个建议中,输出仍然按命令行单独分组,而不是分组在一个 html“代码”或乳胶“阴影”/“逐字”块中。虽然我确实喜欢更简单的代码,但它不符合 OP 的要求。 (我仍然认为我的代码不是很优雅,尽管我认为它是唯一符合要求格式的代码。)如果我遗漏了什么,请帮助我理解。
    • 我真的很喜欢您提供的 rpubs 链接,顺便说一句,出色的工作和不同选项组合的演示。我在所有渲染中都没有得到相同的结果;虽然我发现其中的 CSS/JS 有点难以理解,但渲染结果非常流畅。谢谢,我会参考一下你的 rpubs 页面!
    • 也许是 pandoc 产生了差异结果。每个输出都在一个单独的 &lt;code&gt; 块中。我同意 Ramnath 的解决方案有点具体且不安全,诚然,我的解决方案不安全一点。 pastebin.com/mRYvsvnC 将每次运行的结果(单独完成然后合并)显示为 &lt;h1&gt; 块。 (pandoc 1.12.3,knitr 1.5;使用pandoc(knit('file.Rmd')) 制作;与format='latex' 类似,用于 pdf 比较,未显示。)
    • 在这一点上很明显我没有使用 rmarkdown(我也没有使用 rstudio,尽管我认为这并不重要),所以这几乎肯定是 render() 之间的区别(来自rmarkdown)和pandoc()(来自knitr)。也许亚历克斯应该权衡他正在使用的东西(他列出了我认为是格式的“R-Markdown”,不一定是包)。
    • collapse=TRUE 没有区别。我正在使用 knitr-1.5 和 pandoc-1.12.3。
    【解决方案3】:

    @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 注释移到左括号之前(并且我已经编辑了代码以反映 @ 的定义987654328@ 和 chars)。奇怪,但可能是源整理的副作用。这就是我强制tidy=FALSE 的原因。由于这可能会影响您呈现代码的方式,因此将其用作每个块的选项至少可以限制漂亮的打印问题。

    3. # HIDEME 实际上只是“注释字符加上一些晦涩的字符串”,以便于 greping。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-05-07
      • 2015-09-10
      • 2013-01-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多