rmarkdown::render()输出到标准输出

rmarkdown::render()输出到标准输出,r,r-markdown,knitr,R,R Markdown,Knitr,当我在RStudio中本地读取render()一个*.Rmd文件时,render()函数的输出将显示在控制台中: 基本.Rmd文件: --- title: "test" output: html_document --- ```{r setup, include=FALSE} sink("./output.txt", type = 'output') knitr::opts_chunk$set(echo = TRUE) ``` ## Summary ```{r cars} summar

当我在RStudio中本地读取
render()
一个
*.Rmd
文件时,
render()
函数的输出将显示在控制台中:

基本
.Rmd
文件:

---
title: "test"
output: html_document
---

```{r setup, include=FALSE}

sink("./output.txt", type = 'output')

knitr::opts_chunk$set(echo = TRUE)
```

## Summary

```{r cars}
summary(cars)
```

## Error

```{r}

dbGetQuery()

```
建立:

library(rmarkdown)

render('./test.rmd')
输出:

当我在本地创建报告时,这非常好,我可以看到抛出的进度和错误(如果有)。我需要在stdout(或stderr)中监视此输出,但无法将此输出接收到该位置,因为。我甚至试着改成一个文件,但尽管创建了文件
output.txt
,但该文件中没有任何记录

这对我来说是个问题,因为我在Docker容器中使用
render()
,无法将Docker容器中
.Rmd
文件的区块输出发送到stderr或stdout。我需要监控
.Rmd
文件中容器R代码中的块输出错误(以诊断连接数据库连接错误),并将这些块发送到stdout或stderr是唯一的方法(不登录到容器,在我的用例中(即部署到AWS)是不可能的)

我已经查看了,似乎没有任何选项可以设置为强制块输出到文件或stdout或stderr


是否有某种方法可以将所有区块输出写入
render()
函数内部的stdout或stderr

我认为通常的方法是运行一个单独的R实例并捕获其输出。无任何错误检查:

output <- system2("R","-e \"rmarkdown::render('test.Rmd')\"",
                  stdout = TRUE, stderr = TRUE)

output有两种方法可以解决这个问题-取决于您想要什么

如果希望看到stderr/stdout输出,就像在控制台中一样,最简单的方法是使用shell脚本呈现文档,并通过管道将输出转换为文本。 -包裹 包含一个示例shell脚本,该脚本对于 这个目的。安装
littler
并确保脚本在您的路径上可用后,您可以运行:

render.r test.rmd>output.txt

render.r test.rmd>output.txt 2>&1
将stderr包含在输出文件中

然而,我发现这个控制台输出对于调试和故障排除来说通常不够详细

因此,另一个选项是编辑Rmd文件以记录更多关于进度/错误的详细信息&将记录器输出定向到外部文件

这在云或docker容器计算环境中尤其有用,因为日志可以定向到数据存储,从而允许实时日志记录和跨多个作业搜索日志。就我个人而言,我是使用软件包来实现这一点的

使用由创建的记录器,其工作方式如下:

  • 在Rmd文件中或在Rmd文件中由代码调用的函数中,将重要错误和警告消息重定向到记录器。最好的方法是另一个问题的主题,根据我的经验,不同的任务会有所不同

    • 这至少会导致在Rmd文件中插入一系列R命令,如下所示:
      库(无用的.logger)
      flog.info('查询数据..')
      数据