Как я могу остановить rmarkdown :: render () из файлов Rmd внутри библиотеки renv проекта?

У меня есть блог Hugo, который скомпилирован с использованием маршрута по умолчанию blogdown::build_site().

Я решил renv:: попробовать, потому что некоторые из моих сообщений содержат много сюжетов и склонны зависеть от старых версий пакетов, так почему бы не убедиться, что будущие полные перестройки сайта не вызовут проблем, верно? Помня об этом, я решил, что лучший способ использовать renv - сделать каждое сообщение в блоге (в /content/post/) отдельным проектом renv. Из-за глобального кэширования библиотеки, используемого renv, это даже не должно приводить к большим потерям памяти.

Теперь блог не компилируется, потому что rmarkdown::render() (который вызывается build_site() для каждого сообщения в блоге), кажется, просматривает все дерево каждого сообщения в блоге в поисках файлов Rmd и, конечно же, обнаруживает некоторые из них в папке библиотеки renv, успешно пытаясь скомпилировать их - и предсказуемо терпит неудачу.

Итак, мой вопрос

  • помещает каждое сообщение в блог в свою renv среду вопреки общепринятой практике (я только начинаю изучать Renv и друзей)?
  • если нет, то почему build_site() плохо играет с renv? Я что-то упускаю? Или я обнаружил серьезную проблему? Или я должен просто отпустить и переключиться на метод создания сайта вручную в блоге?

Эта проблема кажется тривиальной (нам просто нужно остановить render() прохождение каталога /renv/), но, насколько я могу судить, это взаимодействие между blogdown и renv кажется неисследованным (я нашел лишь несколько косвенных связанный questions, поэтому я подумал, что сначала могу поискать здесь совета.

Мой сайт построен с использованием Rscript -e "blogdown::build_site(local=FALSE)" (без использования кнопки в RStudio). Как только этот сценарий начинает отображать файлы Rmd внутри renv дерева библиотек, он в конечном итоге терпит неудачу:

$ Rscript -e "blogdown::build_site(local=FALSE)"
Rendering content/post/2016-11-18-notes-inorganic-chemistry/renv/library/R-3.6/x86_64-pc-linux-gnu/blogdown/resources/2015-07-23-r-rmarkdown.Rmd
Rendering content/post/2016-11-18-notes-inorganic-chemistry/renv/library/R-3.6/x86_64-pc-linux-gnu/bookdown/rstudio/templates/project/resources/01-intro.Rmd
[WARNING] This document format requires a nonempty <title> element.
  Defaulting to '01-intro.utf8' as the title.
  To specify a title, use 'title' in metadata or --metadata title="...".
Warning message:
The label(s) intro, methods not found
Rendering content/post/2016-11-18-notes-inorganic-chemistry/renv/library/R-3.6/x86_64-pc-linux-gnu/bookdown/rstudio/templates/project/resources/02-literature.Rmd
[WARNING] This document format requires a nonempty <title> element.
  Defaulting to '02-literature.utf8' as the title.
  To specify a title, use 'title' in metadata or --metadata title="...".
Rendering content/post/2016-11-18-notes-inorganic-chemistry/renv/library/R-3.6/x86_64-pc-linux-gnu/bookdown/rstudio/templates/project/resources/03-method.Rmd
[WARNING] This document format requires a nonempty <title> element.
  Defaulting to '03-method.utf8' as the title.
  To specify a title, use 'title' in metadata or --metadata title="...".
Rendering content/post/2016-11-18-notes-inorganic-chemistry/renv/library/R-3.6/x86_64-pc-linux-gnu/bookdown/rstudio/templates/project/resources/04-application.Rmd
[WARNING] This document format requires a nonempty <title> element.
  Defaulting to '04-application.utf8' as the title.
  To specify a title, use 'title' in metadata or --metadata title="...".
Rendering content/post/2016-11-18-notes-inorganic-chemistry/renv/library/R-3.6/x86_64-pc-linux-gnu/bookdown/rstudio/templates/project/resources/05-summary.Rmd
[WARNING] This document format requires a nonempty <title> element.
  Defaulting to '05-summary.utf8' as the title.
  To specify a title, use 'title' in metadata or --metadata title="...".
Rendering content/post/2016-11-18-notes-inorganic-chemistry/renv/library/R-3.6/x86_64-pc-linux-gnu/bookdown/rstudio/templates/project/resources/06-references.Rmd
[WARNING] This document format requires a nonempty <title> element.
  Defaulting to '06-references.utf8' as the title.
  To specify a title, use 'title' in metadata or --metadata title="...".
Rendering content/post/2016-11-18-notes-inorganic-chemistry/renv/library/R-3.6/x86_64-pc-linux-gnu/bookdown/rstudio/templates/project/resources/index.Rmd
Rendering content/post/2016-11-18-notes-inorganic-chemistry/renv/library/R-3.6/x86_64-pc-linux-gnu/cli/doc/pluralization.Rmd
Quitting from lines 15-15 (./../man/chunks/pluralization.Rmd)
Error in file(con, "r") : cannot open the connection
Calls: local ... call_block -> lapply -> FUN -> knit -> readLines -> file
In addition: Warning message:
In file(con, "r") :
  cannot open file './../man/chunks/pluralization.Rmd': No such file or directory
Execution halted
Error in render_page(f) :
  Failed to render 'content/post/2016-11-18-notes-inorganic-chemistry/renv/library/R-3.6/x86_64-pc-linux-gnu/cli/doc/pluralization.Rmd'
Calls: <Anonymous> -> build_rmds -> render_page
Execution halted

Вот моя информация о сеансе:

> sessionInfo()
R version 3.6.2 (2019-12-12)
Platform: x86_64-pc-linux-gnu (64-bit)
Running under: Ubuntu 18.04.4 LTS

Matrix products: default
BLAS:   /usr/lib/x86_64-linux-gnu/blas/libblas.so.3.7.1
LAPACK: /usr/lib/x86_64-linux-gnu/lapack/liblapack.so.3.7.1

locale:
 [1] LC_CTYPE=en_GB.UTF-8       LC_NUMERIC=C              
 [3] LC_TIME=en_GB.UTF-8        LC_COLLATE=en_GB.UTF-8    
 [5] LC_MONETARY=en_GB.UTF-8    LC_MESSAGES=en_GB.UTF-8   
 [7] LC_PAPER=en_GB.UTF-8       LC_NAME=C                 
 [9] LC_ADDRESS=C               LC_TELEPHONE=C            
[11] LC_MEASUREMENT=en_GB.UTF-8 LC_IDENTIFICATION=C       

attached base packages:
[1] stats     graphics  grDevices utils     datasets  methods   base     

loaded via a namespace (and not attached):
 [1] compiler_3.6.2  htmltools_0.4.0 tools_3.6.2     rstudioapi_0.11
 [5] yaml_2.2.1      Rcpp_1.0.4.6    rmarkdown_2.1   knitr_1.28     
 [9] digest_0.6.25   xfun_0.13       packrat_0.5.0   rlang_0.4.5    
[13] renv_0.9.3      evaluate_0.14  

person solarchemist    schedule 20.04.2020    source источник
comment
github.com/rstudio/blogdown/issues/451   -  person solarchemist    schedule 22.04.2020


Ответы (1)


Что касается второй части моего вопроса, blogdown::build_site() исходный код дает четкие ответы.

build_site() вызывает list_rmds(), который выполняет следующие действия (дословно копируется из источника, достаточно легко, чтобы следовать):

list_rmds = function(dir, check = FALSE) {
  files = list.files(dir, rmd_pattern, recursive = TRUE, full.names = TRUE)
  # exclude Rmd that starts with _ (preserve these names for, e.g., child docs)
  # but include _index.Rmd/.md
  files = files[!grepl('^_', basename(files)) | grepl('^_index[.]', basename(files))]
  # do not allow special characters in filenames so dependency names are more
  # predictable, e.g. foo_files/
  if (check) bookdown:::check_special_chars(files)
  files
}

Как можно видеть, он рекурсивно перечисляет все файлы Rmd, а затем исключает файлы Rmd, начинающиеся с _.

Исходя из этого, становится очевидным, почему renv:: отображает файлы Rmd внутри каталога renv. Также ясно, что использование packrat:: вместо этого не имеет никакого значения.

Способ обойти это, конечно, заключается в использовании собственного сценария сборки сайта, как упоминалось в документации blogdown, но мне все еще интересно, не должна ли комбинация blogdown и renv поддерживаться подходом по умолчанию (при условии, что другие люди любят размещать каждый пост в блоге в собственном проекте renv).

person solarchemist    schedule 21.04.2020
comment
вышеупомянутая проблема теперь решена и закрыта. Последний blogdown::build_site() мастер теперь включает код, чтобы избежать обхода каталогов renv или packrat. Я продолжу и отмечу свой собственный ответ, чтобы закрыть этот вопрос. - person solarchemist; 26.04.2020