Правильный способ пакетной визуализации файлов Rmarkdown для использования с Hugo - PullRequest
1 голос
/ 06 марта 2020

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

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 в верхней части файла.

Например:

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

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

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

Ответы [ 2 ]

1 голос
/ 09 марта 2020

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

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

  1. Поиск .Rmd файлов
  2. Преобразование в .html файлов, отформатированных для HU GO
  3. HU GO подает окончательный файл .html в его местоположение в /public

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

Вместо ручного рендеринга .Rmd файлов через все oop и передачи его переменных, я редактирую строки шаблона и записываю выходные данные как отдельные .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)
}
0 голосов
/ 04 апреля 2020

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

Вот что, кажется, работает:

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

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

Мой 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);
```

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

...