Сегменты, созданные в чанке, не отображаются с помощью rmarkdown :: render_site () - PullRequest
0 голосов
/ 01 ноября 2018

Я создаю сайт с

Rscript -e "rmarkdown::render_site()"

Я генерирую HTML и PDF версии документов. Сюжет, сгенерированный в чанке, не появляется, если документ PDF не сгенерирован до документа HTML.

Вот файлы:

index.Rmd

---
title: "My Website"
---

* [Test1 page](test1.html)

* [Test2 page](test2.html)

_site.yml

name: "my-website"

test1.Rmd (сначала генерируется html)

---
output:
  html_document: default
  pdf_document: default
---

```{r, message=FALSE, echo=FALSE}
library(ggplot2)
ggplot(mtcars, aes(x=mpg, y=disp)) + geom_point()
```

test2.Rmd (сначала сгенерирован pdf)

---
output:
  pdf_document: default
  html_document: default
---

```{r, message=FALSE, echo=FALSE}
library(ggplot2)
ggplot(mtcars, aes(x=mpg, y=disp)) + geom_point()
```

После запуска render_site() через Rscript, test1.html пусто - подкаталога test1_files нет. Однако test2.html показывает этот график (и, конечно, test2_files существует):

enter image description here

Это происходит как с Rmarkdown 1.10, так и с 1.10.14, версией для разработчиков по состоянию на 31 октября.

В более сложном примере из реальной жизни графики не отображаются, даже если я переключаю порядок документов, но я надеюсь, что ответ на эту проблему поможет с более сложным.

ОБНОВЛЕНИЕ: В дополнение к предложениям @giocomai, обходной путь должен скомпилировать test1.Rmd дважды:

Rscript -e "rmarkdown::render_site()"
Rscript -e "rmarkdown::render_site('test1.Rmd')"

Кажется, это работает, даже если вы компилируете несколько отдельных файлов. Предположительно, очистка менее агрессивна в случае с одним файлом.

1 Ответ

0 голосов
/ 01 ноября 2018

Я мог бы воспроизвести вашу проблему, и я думаю, что это связано с тем, что rmarkdown::render() очищает файлы после создания вывода в формате PDF, так как считает, что эти файлы бесполезны, а render_site копирует файлы в _site папка только после того, как все типы вывода были обработаны.

В rmarkdown::render() есть опция для установки clean=FALSE, но она не доступна для rmarkdown::render_site(), так как аргументы не передаются в render.

Я думаю, что стоило бы подать это как проблему для Rmarkdown, так как не должно быть слишком сложно передать аргумент.

В качестве обходного пути вы можете принудительно ввести cache = TRUE в порции соответствующего документа Rmd. Так, например, кусок кода в вашем test1.Rmd будет выглядеть так:

```{r, message=FALSE, echo=FALSE, cache = TRUE}
library(ggplot2)
ggplot(mtcars, aes(x=mpg, y=disp)) + geom_point()
```

обратите внимание на cache = TRUE в параметрах чанка. При включенном кеше папка сохраняется и правильно копируется в папку _site.

Вы также можете установить knitr::opts_chunk$set(cache = TRUE) для всех кусков.

Это решит вашу проблему, но, вероятно, должны быть более элегантные решения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...