在rmarkdown文件/ codechunk中使用Rstudio错误解释echo = false

时间:2016-12-21 23:55:54

标签: r rstudio

我有一个相当基本的问题。假设我在rmarkdown文件中有以下代码块,它只会重置我的全局环境,加载到多个库中,并包含1个print语句。

```{r, echo = FALSE}
rm(list = ls())

# data manipulation
library(jsonlite); library(plyr); library(dplyr); library(data.table); 

# data scraping
library(RSelenium); library(rvest); library(XML); 

# parallel computing / faster code
library(foreach); library(doParallel); library(microbenchmark); 

print("this")

# machine learning
library(rpart.plot); library(glmnet); library(rpart); library(gbm); 
library(nnet); library(caret); library(randomForest); 

# lineup optimization
library(lpSolve);  

# data visualization
library(ggplot2); library(reshape2);
```

当我运行它时,我在控制台中得到以下输出

> rm(list = ls())
> 
> # data manipulation
> library(jsonlite); library(plyr); library(dplyr); library(data.table); 
> 
> # data scraping
> library(RSelenium); library(rvest); library(XML); 
> 
> # parallel computing / faster code
> library(foreach); library(doParallel); library(microbenchmark); 
> 
> print("this")
[1] "this"
> 
> # machine learning
> library(rpart.plot); library(glmnet); library(rpart); library(gbm); 
> library(nnet); library(caret); library(randomForest); 
>  
> # lineup optimization
> library(lpSolve);  
> 
> # data visualization
> library(ggplot2); library(reshape2);

然而,我认为设置echo = false的目的是除了[1]“this”之外的所有内容都应该在控制台中被抑制,这就是我想要的。什么是设置echo = FALSE实际上在做什么?我实际上要做些什么来抑制控制台中代码的重复?我的其余代码都有重要的打印语句,可以确认我的代码是否正常运行,但是代码重复会在控制台中被淹没。

谢谢,

2 个答案:

答案 0 :(得分:2)

请注意,块选项仅影响编织时的输出显示。采购独立于针织的代码需要采用不同的方法。

当您加载包时,您在大多数时间看到的是消息,而不是源代码。因此,为了抑制## Attaching package: 'dplyr' ...之类的内容,您还必须添加选项message = FALSE,因此块指令将{r , echo = FALSE, message = FALSE}来抑制编织文档中的消息和源代码。

答案 1 :(得分:0)

Knitr并非旨在改变控制台中显示的内容。 R控制台和历史记录保留了所有命令和输出的完美,逐字复制,据我所知,没有办法改变这种行为。我强烈建议您也不应该尝试更改它,因为想象一下您运行了一些分析并忘记运行代码块:您没有要检查的命令的审计跟踪。

Knitr旨在创建文档(大多数情况下为html,docx或pdf),更改chunk选项(如echo会影响生成的文档中显示的内容,不< / em>控制台。如何控制输出在knitr网页上有详细记录:http://yihui.name/knitr/demo/output/

确定我们不会得到您想要的内容,这里有一些选项可以帮助您将代码与输出分开:

使用ctrl/cmd + L

这简单地清除了控制台,因此您可以单步执行,清除您不需要的内容,并运行带有结果的代码段。这需要大量的人工干预;不推荐。

使用sink()

sink()允许您将输出保存到文本文件,因此.R脚本的流程可能如下所示:

...    
# parallel computing / faster code
library(foreach); library(doParallel); library(microbenchmark); 

sink(file = "test.txt")
print("this")
sink()

# machine learning
library(rpart.plot); library(glmnet); library(rpart); library(gbm); 
library(nnet); library(caret); library(randomForest);

sink(file = "test.txt", append = TRUE)
print("that")
sink()
...

test.txt的内容现在看起来像这样:

[1] "this"
[1] "that"

不要忘记 append = TRUE ,否则内容将被覆盖,这可能不是您想要的。

sink()有效,但现在有更简单,更优雅的解决方案......

使用knitr(按预期)

我一直使用knitr正是因为您正在寻找解决方案,即将执行代码与结果分开。

分开你的块和下面的例子(编织时!)将为你提供一份与你正在寻找的文件相符的文件:

---
title: "test"
author: "Canovice"
date: "22 December 2016"
output: html_document
---

```{r setup, include=FALSE}
knitr::opts_chunk$set(
    echo = FALSE,
    message = FALSE,
    warning = FALSE
)
```

```{r}
# rm(list = ls())
# you don't need this
# by default, each time you knit, knitr uses a clean session

# data manipulation
library(jsonlite); library(plyr); library(dplyr); library(data.table)

# data scraping
library(RSelenium); library(rvest); library(XML)

# parallel computing / faster code
library(foreach); library(doParallel); library(microbenchmark)
```

```{r}
print("this")
```

```{r}
# machine learning
library(rpart.plot); library(glmnet); library(rpart); library(gbm); 
library(nnet); library(caret); library(randomForest); 

# lineup optimization
library(lpSolve);  

# data visualization
library(ggplot2); library(reshape2)
```

结果文档只显示代码的结果:

  

测试

     

Canovice

     

2016年12月22日

     

## [1] "this"

使用R Notebook

在RStudio版本中&gt; 1.0你可以使用新的R笔记本格式,其工作方式与Rmarkdown knitr文档相同,只是有一个方便的按钮,可以根据需要显示或隐藏代码。

例如:https://rpubs.com/pssguy/220641

在页面顶部,每个部分都有一个显示或隐藏代码的选项,只留下结果。