pandoc SOMETIMES не может найти файл utf8.md - PullRequest
0 голосов
/ 25 апреля 2018

У меня есть код R, который отображает несколько отчетов HTML rmarkdown в цикле.Это примерно код в цикле:

knitr::knit_meta(class=NULL, clean = TRUE)
rmarkdown::render(input =paste0("10_ReportingHTML/10_01_ReportingPortfoliosHTML.Rmd"), output_file = paste0(reportPath), params = list(MyDataFrame = MyDataFrame[i]))

Под MyDataFrame [i] я имею в виду, что входной data.frame отличается на каждой итерации цикла.

Я позволил этому коду работатьсервер AWS, параллельный на нескольких ядрах.Параллельно я имею в виду, что мой код выполняется одновременно в нескольких потоках, но с разными входными данными.

Иногда он выполняется без проблем, но иногда возникает следующая ошибка:

pandoc: 10_01_ReportingPortfoliosHTML.utf8.md: openBinaryFile: does not exist (No such file or directory)

Делаете ли выесть идеи, почему это происходит и почему не регулярно?

Обновление:

После некоторого дальнейшего изучения я обнаружил, что все параллельные потоки используют один и тот же рабочий каталоги создаем метаданные knitr с такими же именами.Вот почему, если один поток очищает все метаданные, он также исчезает в других потоках.Более того, если я не очищаю метаданные, я получаю сумасшедшее смешение данных разных потоков: я решил их ужасным образом, скопировав код для каждого параллельного процесса в отдельный каталог с уникальным именем и установив егов качестве рабочего каталога для этого процесса.После того, как процесс завершен, этот уникальный временный созданный рабочий каталог удаляется:

libPath = "Some/Unique/directory"
system(paste0("cp ", R_FUNCTIONS_PATH, "10_ReportingHTML/10_01_ReportingPortfoliosHTML.Rmd ", libPath, "/"), intern = T)
rmarkdown::render(input =paste0(libPath, "/10_01_ReportingPortfoliosHTML.Rmd"), output_file = paste0(reportPath), params = list(MyDataFrame = MyDataFrame[i]))
knitr::knit_meta(class=NULL, clean = TRUE)
system(paste0("rm -r ", libPath), intern = T)

Мой обновленный вопрос: есть ли какая-либо другая возможность установить рабочий каталог в местоположение, отличное от аргумента "input" из render() функция (где-то отличается от местоположения кода .Rmd)?

1 Ответ

0 голосов
/ 02 октября 2018

После некоторого дальнейшего изучения я обнаружил, что все параллельные потоки используют один и тот же рабочий каталог и создают метаданные knitr с одинаковыми именами.Вот почему, если один поток очищает все метаданные, он также исчезает в других потоках.Более того, если я не очищаю метаданные, я получаю сумасшедшее смешение данных разных потоков: я решил их ужасным образом, скопировав код для каждого параллельного процесса в отдельный каталог с уникальным именем и установив егов качестве рабочего каталога для этого процесса.После завершения процесса этот уникальный временно созданный рабочий каталог стирается:

libPath = "Some/Unique/directory"

system(paste0("cp ", R_FUNCTIONS_PATH, "10_ReportingHTML/10_01_ReportingPortfoliosHTML.Rmd ", libPath, "/"), intern = T)

rmarkdown::render(input =paste0(libPath, "/10_01_ReportingPortfoliosHTML.Rmd"), 
                  output_file = paste0(reportPath), 
                  params = list(MyDataFrame = MyDataFrame[i]))

knitr::knit_meta(class=NULL, clean = TRUE)

system(paste0("rm -r ", libPath), intern = T)
...