3

假设我有一个名为的项目目录testknit(我确实有,请参阅github了解 MRE),其中我有几个子目录,包括scripts我保存的位置.R.rmd文件。

在 RStudio 中,我创建了一个项目并选择了这个testknit目录,这样当我打开项目时,工作目录是mypath/testknit.

在里面testknit/scripts我有一个master.R文件。如果我想获取一个名为 的文件testsource1.R,该文件也位于 中testknit/scripts,我可以source("scripts/testsource1.R")从内部运行master.R

library(knitr)
getwd()
# [1] "mypath/testknit"
source("scripts/testsource1.R")

到目前为止,一切都很好。

但是假设我还想编织一个.rmd名为的文件,该文件test.rmd位于testknit/scripts. 我可以knit("scripts/test.rmd")master.R.

我的test.rmd文件执行以下操作:

```{r setup}
  library(knitr)
  opts_knit$set(root.dir='../')
```

```{r option1}
  source("scripts/testsource2.R")
```

```{r option2}
  source("testsource2.R")
```

由于test.rmd存在于 中testknit/scripts,因此我在第一个块中指定opts_knit$set(root.dir='../'),因此 knitr 知道我的根目录实际上是上一层。

当我test.rmd在 RStudio 中打开并单击knit HTML时,可以预见的是,该option1块有效,而该option2块不起作用。

但是当我尝试通过从文件中test.rmd运行而不是从文件中编织来编织时,这两个块选项都不起作用。两者都返回一个错误,即没有该名称的文件。knit("scripts/test.rmd")master.R.rmd

我究竟做错了什么?为什么从 mastertestsource2.R编织文件时R 找不到?.rmd.R

有关可重现的示例,请参见上面的 github 链接。

更新:

正如我在下面的评论中指出的那样,我尝试wd <- getwd()在之前添加opts_knit$set并更改(root.dir='../')(root.dir=wd). 因此,当我从 运行knit("scripts/test.rmd")master.R,option2 块运行,因为wd我添加的设置为mypath/testknit/scripts. 但是如果我打开.rmd文件并运行所有块,wd设置为根目录,mypath/testknit并且 option1 块运行。

我需要工作目录来保持项目根目录。这对我来说似乎不是一个优雅的解决方案,但正在改变:

```{r setup}
  library(knitr)
  opts_knit$set(root.dir='../')
```

```{r setup}
  library(knitr)
  wd <- ifelse(basename(getwd())=="scripts", 
               gsub("/scripts", "", getwd()),
               getwd())
  opts_knit$set(root.dir=wd)
```

让我在.rmd文件中或knit("scripts/test.rmd")master.R. 它有效,但感觉就像我采取了错误的方法。

4

1 回答 1

3

@Yihui:也许您可以../使用normalizePath('../'). 相对工作目录可能会令人困惑(至少在我阅读了太多级别的相对路径后我的头疼:)。顺便说一句,当您在 RStudio 中编写 HTML 时,RStudio 首先将工作目录更改为输入 Rmd 文件。

我可以!using 仅opts_knit$set(root.dir=normalizePath('../'))适用于.rmd从 编织文件master.R和编织到 html 或从.rmd. 我更新了github 示例test-b.rmd现在显示了这一点。谢谢!

于 2013-12-05T20:58:59.133 回答