使用子目录使用knitr

Mar*_*ese 19 r knitr

我有一个项目文件夹,这是我的工作目录.我们称之为项目.根据该项目的文件夹中有4个子目录: code,data,figures,和documents.

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

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

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

然后我尝试设置相对于工作目录的图形路径.

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

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

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

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

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

base.dir = "./figures" 
Run Code Online (Sandbox Code Playgroud)

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子目录,现在可以使用"./data"它来访问代码.但是,全局设置不适用于数字输出.因此,正确的规范是opts_chunk$set(fig.path = "../figures/")- 使用../而不是./.我认为Richie Cotton解决了这个问题,我暂时没有看到它.

我还用码头OSX以创建符号链接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

Eri*_*een 8

试试这个.它假设您在工作目录中列出了4个文件夹project.它还假定你有一个.csv名为文件myData.csvdata.

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

```{r setup}
  library(knitr)
  opts_knit$set(root.dir=normalizePath('../'))
  opts_chunk$set(fig.path = "../figures/", dev='pdf') # corrected path and added dev
```

```{r import}
  dat <- read.csv("data/myData.csv")
```

```{r plot}
  # pdf(file="figures/test.pdf")  # I do this in setup instead
  plot(dat)
  # dev.off()
```

```{r move}
  files <- list.files("code/")
  index <- grep("html", files)
  file.rename(file.path("code", files[index]),
              file.path("documents", files[index]))
```
Run Code Online (Sandbox Code Playgroud)

  • 谢谢.如果它有助于其他人,有一件让我感到惊讶的事情是你需要在knitr文件开头的一个离散块中使用opts_knit $ set ... 目录更改仅从下一个块生效. (2认同)