2015-01-12 33 views
3

我刚开始使用rmarkdown,pandoc和knitr。我有很大的困难,试图让pandoc获取比rmarkdown文档高一级的图像。例如,考虑我们的项目目录〜/测试,下面rmarkdown位于〜/测试/脚本:pandoc和rmarkdown:无法获取高于rmarkdown文档一级的图像

--- 
title: "test" 
--- 

```{r global_options, include=FALSE} 
library('knitr') 
opts_knit$set(root.dir = '~/test') 
``` 

![test](figures/test.svg) 

然后我在〜/ test目录运行命令Rscript -e "rmarkdown::render('scripts/test.Rmd')"。它给我的错误:

pandoc: Could not fetch figures/test.svg 
figures/test.svg: openBinaryFile: does not exist (No such file or directory) 

我会通过设置root.dir是项目目录有想到,这pandoc相对于该文件将获取?但似乎“工作目录”总是设置为相对于rmarkdown文档的位置?任何帮助,将不胜感激。谢谢,

>sessionInfo() 
R version 3.1.0 (2014-04-10) 
Platform: x86_64-unknown-linux-gnu (64-bit) 

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

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

other attached packages: 
[1] vimcom_1.0-0 setwidth_1.0-3 colorout_1.0-2 

loaded via a namespace (and not attached): 
[1] tools_3.1.0` 
+0

如果您从'scripts'目录内运行脚本,它会工作吗? –

+0

不幸的是没有。当我运行时,cd〜/ test/scripts && Rscript -e“rmarkdown :: render('scripts/test.Rmd')”我得到同样的错误。 – TinyHeero

+0

我认为你应该从'脚本'里面运行'scripts/test.Rmd'到'test.Rmd' –

回答

2

Pandoc不知道knitrroot.dir选项。您必须写入相对于当前工作目录的路径,例如../figures/test.svg。或在scripts目录下运行Rscript

如果您在使用rmarkdownknitr刚开始,我强烈建议你不要使用root.dir选项,除非你真的明白是什么意思。这些目录可以是really, really tricky

+0

这让我感到困惑。当我从〜/ test目录运行Rscript -e“rmarkdown :: render('scripts/test.Rmd')时,是不是我的工作目录〜/ test,因为那是我从哪里调用的?而且数字是一个文件夹(忘了提及这个)与〜/ test是同一级别的,所以这意味着数字/ test.svg应该正确的路径,但它不起作用 – TinyHeero

+0

@ user2774754你在R中的工作目录是〜/〜测试'但是因为你渲染('scripts/test.Rmd')',我相信rmarkdown会暂时将工作目录改为'scripts /',在这种情况下,你必须使用'../figures/test .svg'。我个人建议用户在它的目录下编译一个Rmd文件,并且认为所有的路径都是相对于Rmd文件的目录。如果你从另一个目录渲染一个Rmd文件,事情会变得非常棘手。 –

+0

ok我之所以喜欢在Rmd上运行Rscript一个目录是因为在实践中我实际上有一个“包装器”脚本,它调用Rmd文件。包装脚本是一个R文件,负责加载所有输入数据和预处理数据。然后它是rmarkdown :: render()函数的脚本。所以,当它加载所有的数据时,数据与我称之为的地方有关(这是应该发生的事情)。在实践中,你是否也加载和处理你的Rmd文件中的所有数据?我想知道,所以我知道什么是正确的做法... – TinyHeero