Правильный способ пакетного рендеринга файлов Rmarkdown для использования с Hugo

Я пытаюсь отобразить кучу .html страниц из .Rmd, используя rmarkdown::render() в шаблоне .Rmd, и передать ему некоторую переменную через цикл.

for (i in some_vector){
  rmarkdown::render(my_template.Rmd,
                    output_format = "html_document",
                    output_file = ... ,
                    output_dir = ... )
}

Шаблон настроен на ожидание переменной и обрабатывается нормально. Однако другие страницы .Rmd в других частях сайта больше не отображаются должным образом, если я сгенерирую свои .html файлы, а затем запустил blogdown::serve_site()

Файлы .html, отображаемые с помощью blogdown :: serve_site (), по-видимому, имеют неправильные заголовки и отсутствуют части html при автоматическом отображении с помощью blogdown. Сгенерированная html-страница по-прежнему сохраняет компоненты заголовка yaml в верхней части файла.

Eg:

---
title = 
date = 
layout = 
author =
--- 

Если я не создаю файлы в пакетном режиме, а просто запустил serve_site () для существующих файлов сайта, у меня не возникнет проблем. Я подозреваю, что запуск rmarkdown :: render () изменяет какой-то параметр сеанса, но я понятия не имею. Моя цель - создать необходимые страницы самостоятельно, а затем сделать так, чтобы остальные страницы были отображены на serve_site ().

Кто-нибудь знает, в чем проблема?


person Yuriy Grabovsky    schedule 06.03.2020    source источник
comment
Я просто определяю команду .bashrc для этого в пакетном режиме: serveSite() { Rscript -e "blogdown::serve_site()"; } и набираю serveSite в командной строке.   -  person Frank Harrell    schedule 07.03.2020
comment
Привет, я не знаю, как это решить мою проблему? Может я не правильно понимаю? Я использую blogdown через Rstudio, но в любом случае у меня возникают проблемы с тем, что blogdown :: serve_site () и rmarkdown :: render () каким-то образом конфликтуют и заставляют отображаемые страницы выглядеть по-разному, когда они оба запущены.   -  person Yuriy Grabovsky    schedule 09.03.2020
comment
Я просто обнаружил, что запуск serveSite отдельно приводит к автоматическому созданию любого дочернего файла при изменении соответствующего родительского файла.   -  person Frank Harrell    schedule 09.03.2020


Ответы (2)


Итак, я разработал, как сгенерировать правильные выходные файлы. Моя проблема возникла из-за незнания того, как работает blogdown.

По сути, при обслуживании сайта blogdown делает следующее:

  1. Найдите .Rmd файл
  2. Преобразование в .html файлы, отформатированные для HUGO
  3. HUGO отправляет последний .html файл на его место в /public

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

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

file.src <- file("~/R/sample_proforma_2.Rmd", 
                 open = "r")
file.lines <- readLines(file.src)
rmd.list <- list()
for(i in c("sample_117" ,"sample_118", "sample_119", "sample_121")){
  tmp.lines <- file.lines
  tmp.lines[4] <- gsub("empty\\+title", gsub("_", " ", toupper(i)), tmp.lines[4])
  tmp.lines[6] <- gsub("empty\\+title", gsub("_", " ", toupper(i)), tmp.lines[6])
  tmp.lines[9] <- gsub("empty\\+circos", toupper(i), tmp.lines[9])
  tmp.lines[15] <- gsub("empty\\+maf", i, tmp.lines[15])
  tmp.lines[21] <- gsub("empty\\+tag", i, c("- CIRCOS\n- MAF"))
  rmd.list[[i]] <- tmp.lines
}

for (i in names(rmd.list)){
  write.table(rmd.list[[i]],
              paste0("~/content/sample/",i,".Rmd"),
              sep = "",
              quote = FALSE,
              col.names = FALSE,
              row.names = FALSE)
}
person Yuriy Grabovsky    schedule 09.03.2020

Я часами боролся с той же проблемой. Я хочу создать тысячи отдельных страниц (с R, Blogdown и Hugo) из ~ 10 шаблонов и написать все сценарии.

Вот что вроде работает:

  1. Используйте свой собственный R / build.R для создания страниц markdown (.md) в цикле.
  2. Попросите Хьюго преобразовать файл уценки (.md) в HTML
  3. Используйте knitr :: knit, а не rmarkdown: render, чтобы преобразовать шаблоны Rmarkdown (.Rmd) в уценку (.md).
  4. Единственный способ поместить изображения в нужные места с правильными относительными URL-адресами с помощью knit () - это а) установить output = 'dest/dir/file_name.md', б) использовать fig.path='figure' (или что угодно) И в) перемещать каталог fig.path под dest/dir/figure после каждого knit().

В противном случае knit() либо помещает изображения в ROOT/figure, либо создает относительные ссылки на изображения в файле .md, например dest/dir/figure/plot.png для страницы, которая уже находится в dest/dir/.

My R/build.R.

updates <- c( '6.3', '6.4', '6.5');
library('knitr')

dir.create(file.path('content/', 'update'), showWarnings = FALSE);

for (update in updates) {
  dir_name <- paste0('content/update/', update);
  dir.create(file.path(dir_name), showWarnings = FALSE);
  knit(input = 'R/update.rmd', output = paste0(dir_name, '/_index.md'));
  ## THIS IS REQUIRED AFTER EVERY knit()!!! 
  ## otherwise the image links go wrong and/or the next knit() may overwrite the previous plots

  file.rename('figure', paste0(dir_name, '/figure'));    
}

и R/update.rmd:

---
title: Version `r update`
date: `r Sys.Date()`
author: Jylpah
output: md_document
---
This is a test. Version is `r update`. 

```{r, plot, echo=FALSE, fig.path='figure/'}
A <- sample(10,50,replace = TRUE);
hist(A);
```

## Something else

Another plot

```{r, plot_another, echo=FALSE, fig.path='figure/'}
B <- sample(10,50,replace = TRUE);
hist(B);
```

Надеюсь, сказанное выше как-то понятно и поможет вам и другим.

person Jylpah    schedule 04.04.2020
comment
Привет, если вы видите в моем собственном ответе выше, я делаю что-то немного другое. У меня есть шаблон .Rmd, который я прочитал, используя readLines(), и в цикле я заменяю код, который мне нужен. Затем я просто записываю результат каждого цикла в отдельный .Rmd файл. Это позволяет избежать проблем с knitr::knit() и rmarkdown:render() и просто генерирует документы, готовые для рендеринга Hugo. Это не самое элегантное решение, но оно мне подходит. - person Yuriy Grabovsky; 05.04.2020
comment
Привет, я видел ваш подход, но разве он не был таким элегантным и гибким, если на разных страницах разная обложка и т. Д. Просто хотел опубликовать свое решение для других, борющихся с той же проблемой. - person Jylpah; 06.04.2020