rmarkdown :: render () выводит на стандартный вывод - PullRequest
0 голосов
/ 14 апреля 2020

Когда я render() и *.Rmd файл локально в RStudio, вывод из функции render() отображается в консоли:

Basi c .Rmd file:

---
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')

Вывод:

enter image description here

Это замечательно, когда я создаю отчеты локально и я вижу прогресс и ошибки (если есть). Мне нужно контролировать этот вывод в stdout (или stderr), но я не могу передать этот вывод в это место, потому что knitr использует capture.input, который использует sink() (см. Первый комментарий) . Вместо этого я даже попытался пропустить файл, но хотя файл output.txt создан, в этом файле ничего не записано.

Это проблема для меня, потому что я использую render() в * 1042 Я не могу отправить вывод чанка из файла .Rmd в контейнере Docker в stderr или stdout. Мне нужно отслеживать вывод чанка на наличие ошибок в коде контейнера R внутри файла .Rmd (для диагностики ошибок соединения БД соединения), и отправка этих чанков в stdout или stderr - единственный способ сделать это (без входа в контейнер который в моем случае использования (т. е. развернутый в AWS) невозможен)

Я рассмотрел параметры knitr chunk , и, кажется, не существует никакой опции, которую я могу установить принудительно выводить чанк в файл или в stdout или stderr.

Есть ли какой-нибудь способ, которым я могу записать весь вывод чанка в stdout или stderr внутри функции render()? Этот вопрос нескольких лет похож на мой (если не идентичен), но принятый ответ не подходит для моего варианта использования

1 Ответ

0 голосов
/ 15 апреля 2020

Я считаю, что обычный способ сделать это - запустить отдельный экземпляр R и захватить его вывод. Без проверки ошибок:

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

Все выходные данные помещаются в вектор output. Возможно, вы можете запустить анализ кода в контейнере docker для поиска проблем.

...