我正在开发一个通用管道,该管道将跨多个项目运行,并且希望使用Rmarkdown笔记本生成最终报告。
所以我的目录结构可能类似于:
/home/user/devel/pipelines/
| - pipeline1/
| - pipeline2/
| - pipeline3/
| - .git
| - default_configuration.ini
| - processing_pipeline.py
| - report.Rmd
/cluster/lustre/projects/
| - project1/
| - project2/
| - project3/
| - data/
| - pipeline1_results/
| - pipeline2_results/
| - pipeline3_results/
| - configuration.ini
| - results.tsv.gz
| - results... [VARIOUS ANALYSIS PRODUCTS]
| - [finished report will go here]....
在理想情况下,我想将Rmarkdown源代码保留在devel
目录中,受版本控制。我想使用Rstudio工作目录而不是Rmd
的位置作为工作目录,在Rstudio上针对示例数据集以交互方式开发报告,并且对于以后的数据集,可以使用脚本命令和使用当前目录作为工作目录,而无需更改任何代码。
我可以通过添加类似以下内容来完成第一部分:
```{r setup}
knitr::opts_knit$set(root.dir="/cluster/lusture/projects/project3/pipeline3/")
```
但是现在我已经对笔记本进行了硬编码,使其可以在特定的目录中运行,而不仅仅是在R会话的工作目录中运行,因此当我想在其他项目上运行时,此操作将失败(可能以批处理方式进行编织)
我可以通过让管道执行类似以下内容来完成最后一部分:
Rscript -e 'library(rmarkdown);
opts_knit$set(root.dir = ".");
render("/path/to/source/report.Rmd")'
分析目录中的。但这对于交互式会话不起作用。
我还希望report.Rmd尝试从当前目录加载configuration.ini
,如果不存在,请从源目录加载。但是我不知道如何在交互式会话中和编织时都可以使用Rmd中的源目录。