我有一个R代码,它在一个循环中呈现几个rmarkdown HTML报告。 这大致是循环中的代码:
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]))
By 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)
我的更新问题:是否还有其他可能将工作目录设置到与"输入"不同的位置。来自render()
函数的参数(某处与.Rmd代码位置不同)?
答案 0 :(得分:0)
经过进一步的研究,我发现所有并行线程都使用相同的工作目录,并且正在创建具有相同名称的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)