首页 > 解决方案 > 如果块有 message = FALSE,则安静地渲染不起作用

问题描述

我想安静地渲染一个 R Markdown 文件,即控制台中不应该显示任何内容。让我们foo.Rmd成为以下文件:

---
title: "Foo"
output: 
    html_vignette

vignette: >
  %\VignetteIndexEntry{Foo}
  %\VignetteEngine{knitr::rmarkdown}
  %\VignetteEncoding{UTF-8}

---

```{r}
library(survey)
```

使用rmarkdown::render("foo.Rmd", quiet = TRUE)正常。但是,如果我添加message=FALSE到块中,则会出现一些由加载包生成的消息:

---
title: "Foo"
output: 
    html_vignette

vignette: >
  %\VignetteIndexEntry{Foo}
  %\VignetteEngine{knitr::rmarkdown}
  %\VignetteEncoding{UTF-8}

---

```{r, message=FALSE}
library(survey)
```
> rmarkdown::render("foo.Rmd", quiet = TRUE)
Loading required package: grid
Loading required package: Matrix
Loading required package: survival

Attaching package: 'survey'

The following object is masked from 'package:graphics':

    dotchart

(请注意,每次添加或删除时都必须重新启动会话message=FALSE,因为每个会话只显示一次消息。)

这是一个错误吗?还是我错过了什么?

标签: rr-markdown

解决方案


我认为,它不一定是“错误”。R认为无论如何都应该显示消息。我认为quiet函数中的参数render可以很好地抑制任何内容,同时确保消息显示在某处(在Rmarkdown输出中)。
但是当您在Rmarkdown输出中抑制消息时,在控制台中打印消息会取代quiet功能,因为R想要在某个地方显示消息(可能在“输出”或“控制台”中)。github中也出现了
同样的问题,我认为这与您的问题有些相似。 您的问题也可能出现在 github 中,因此开发人员会考虑更改此选项。bash chunk
knitrR

你当然知道,完全摆脱消息的一种方法是使用sink函数将所有消息转移到文件中。

然后,您可以像以前一样在“输出”中message = F抑制消息,也可以在控制台中抑制消息。

Restarting R session...

> divert_file <- file("divert_file.txt",open ="wt")
> sink(divert_file, type = "message")
> rmarkdown::render("foo.Rmd", quiet = T)
>

推荐阅读