使用子目录使用knitr

时间:2014-07-05 10:04:42

标签: r knitr

我有一个项目文件夹,这是我的工作目录。我们称之为项目。在项目文件夹下有4个子目录:codedatafiguresdocuments

我想将.Rmd文件放在code子目录中。我希望这些数字进入figures子目录。我希望.html.md.docx文件进入documents子目录。我想从data子目录中读取我的数据。这种组织结构是否可行?我似乎无法让它发挥作用。

我从这开始将工作目录设置为project因为我知道knitr查找带有.Rmd文件的文件夹,如果没有指定,则将其视为工作目录。

```{r setglobal, cache = FALSE, include = TRUE}
library(knitr)
opts_knit$set(root.dir = "..")
```

然后我尝试设置相对于工作目录的数字路径。

```{r setchunk, cache=FALSE, include=TRUE}
opts_chunk$set(fig.path = "./figures/")
getwd()
```

工作目录已正确报告为project。从data子目录中正确读取数据。正确呈现所有输出并运行所有代码。

```{r readdata}
crctx <- readRDS("./data/crctx.rds")
getwd()
*run lots of analyses here*
```

但这些数字最终会出现在project/code/figures目录中,而不是project/figures

我也尝试过设置base.dir,但这似乎没有改变任何东西。我添加了参数

base.dir = "./figures" 

opts_knit$set列表。我甚至尝试过硬编码的完整路径。但似乎没有什么能够改变这一点。

我使用的是R 3.10和RStudio 0.98.953。这是Mac 0SX 10.9.4。

我错过了什么吗?有没有办法将输出文件放在自己的目录中?

这个重要的原因是我希望我们公司都使用相同的目录结构,这将使我们能够更好地组织我们的项目。

提前感谢您的帮助。

更新

我意识到opts_chunk$set(fig.path = "./figures/")不正确。我假设使用opts_knit$set(root.dir = normalizePath("../"))将根目录设置为项目文件夹会对knitr进行全局更改,因为这就是它应该做的事情。它确实适用于数据子目录,现在可以使用允许代码运行的"./data"来访问它。但是,全局设置不适用于数字输出。因此,正确的规范是opts_chunk$set(fig.path = "../figures/") - 使用../代替./。我认为Richie Cotton解决了这个问题,我暂时没有看到它。

我还在OSX中使用Terminal来创建从project/documentsproject/code/figure的符号链接,该链接由knitr默认创建。有了这个,knitr会查找正确的子子目录,但所有内容都以projects/documents结尾。这非常有效。我不能让R使用file.symlink正确创建符号链接。但它在终端中运行良好。去图。

更新2

我也得到了输出文件。您必须直接使用编织命令。正文如下。

Knitr代码在代码/分析中使用.Rmd编织markdown文档并在输出/报告中输出:     knit("./code/knitr_file.Rmd", "./documents/knitr_output.md”)

将.md文件转换为.docx的Pandoc代码 - 使用与.md文件相同的文件夹 pandoc("./documents/knitr_output.md", format = "docx”)

输出样式(来自knitr文档)

pandoc('knitr_output.md', format='html') # HTML pandoc('knitr_output.md', format='latex') # LaTeX/PDF pandoc('knitr_output.md', format='docx') # MS Word pandoc('knitr_output.md', format='odt') # OpenDocument

2 个答案:

答案 0 :(得分:8)

试试这个。它假设您在工作目录project中列出了4个文件夹。它还假设您在.csv中有一个名为myData.csv的{​​{1}}文件。

编织文件时,图表将保存在data中。最后,代码会在figures中查找html个文件,并将其移至code。可能有更好的方法来做到这一点。

documents

答案 1 :(得分:0)

我使用这种方法。将它放在rmd文件的开头,您将能够在线使用运行代码并使用RStudio项目设置。诀窍是将knitr主目录重置为你的项目目录(我的项目目录中有几个,因此&#39; /../../'但你得到了这个想法)。您还需要重置数字和缓存路径,否则输出将在奇怪的地方结束。

如果您使用下面的设置,您可以根据项目需要创建正确的文件结构。

```{r setup, include=FALSE}
###--- Update the knitr working directory (R works from the project folder, knitr works in the rmd folder)
dd <- getwd()
knitr::opts_knit$set(root.dir= paste(dd,'/../../')) 

###--- Set some knitr defaults for all of the code blocks below. 
knitr::opts_chunk$set(warning=FALSE
                      ,error=FALSE
                      ,message=FALSE
                      ,cache=F
                      ,eval=TRUE
                      ,results='asis'
                      ,echo=TRUE
                      ,fig.ext="png"
                      ,cache.path = paste0(dd,'/cache/')
                      ,fig.path = paste0(dd,'/figures/')
                      ) 
```