【问题标题】:Working with knitr using subdirectories使用子目录使用 knitr
【发布时间】:2014-08-26 10:33:23
【问题描述】:

我有一个项目文件夹,这是我的工作目录。我们称之为项目project 文件夹下有 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 中的终端创建了一个从 project/documentsproject/code/figure 的符号链接,这是由 knitr 默认创建的。有了这个,knitr 查找正确的子目录,但所有内容都以projects/documents 结尾。这真的很好。我无法让 R 使用 file.symlink 正确创建符号链接。但它在终端中运行良好。去图吧。

更新 2

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

Knitr 代码用于在代码/分析中使用 .Rmd 编​​织降价文档并在输出/报告中输出: 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

【问题讨论】:

  • 看看normalizePath是否适合你。
  • 我查看了语法,但无法弄清楚它应该做什么。不过我可以再看看。
  • 一个老问题,但这可能对stackoverflow.com/a/51144177/4241780有帮助,它展示了如何在编织时将工作目录设置为主项目文件夹。

标签: r knitr


【解决方案1】:

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

编织文件时,绘图将保存在figures。最后,代码在code 中查找html 文件并将它们移动到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]))
```

【讨论】:

  • 我用opts_knit$set(root.dir = "../");opts_chunk$set(fig.path = "../figures/test-") 实现了图形部分。在看到您的帖子后,我尝试了 ../,因为单独使用 .. 是行不通的,grrr。
  • @eric 谢谢。我现在了解 normalizePath ,但这不起作用。我还尝试使用paste(getwd(), "/figures/", sep="")),这是normalizePath() 的手动方式,但没有奏效。我喜欢手动操作。我认为也许调用knit,而不是单击按钮,可能能够设置输出.md 文件。然后调用 pandoc 可能会用于设置输出 .docx 或 .pdf 文件。必须调查一下。
  • 嗯,它对我有用。尝试从this GitHub repo 获取/dir 文件夹。确保setwd()/dir。你应该可以点击knit
  • 尝试编织两次以使html文件移动。
  • 谢谢。万一它对其他人有所帮助,让我感到惊讶的一件事是,您需要在 knitr 文件的开头将 opts_knit$set ... 放在一个离散的块中。目录更改仅从下一个块生效。
【解决方案2】:

我使用这种方法。将其放在 rmd 文件的开头,您将能够在线运行代码并使用 RStudio 项目设置。诀窍是将 knitr 主目录重置为您的项目目录(我的是项目目录中的一对,因此是“/../../”,但您明白了)。您还需要重置图形和缓存路径,否则输出将最终出现在奇怪的地方。

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

```{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/')
                      ) 
```

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-02-20
    • 2016-04-21
    • 1970-01-01
    • 1970-01-01
    • 2015-07-26
    • 2015-08-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多