【问题标题】:trouble finding file source in .rmd chunk when knitting .rmd from master .R file从主 .R 文件编织 .rmd 时在 .rmd 块中查找文件源时遇到问题
【发布时间】:2013-11-09 19:38:26
【问题描述】:

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

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

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

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

到目前为止一切顺利。

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

我的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 知道我的根目录实际上是上一层。

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

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

我做错了什么?为什么R在从主.R编织.rmd文件时找不到testsource2.R

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

更新:

正如我在下面的 cmets 中所指出的,我尝试在 opts_knit$set 之前添加 wd <- getwd() 并将 (root.dir='../') 更改为 (root.dir=wd)。所以当我从master.R 运行knit("scripts/test.rmd") 时,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 文件或master.R 中的knit("scripts/test.rmd") 中运行所有块。它有效,但感觉我采取了错误的方法。

【问题讨论】:

  • 不知道,但你为什么不通过在每个块中添加 getwd() 调用来进一步检测你的 .rmd 文件?
  • @BenBolker,我在opts_knit$set(root.dir=wd) 之前添加了wd &lt;- getwd()。我不明白为什么,但现在当我从master.R 运行knit("scripts/test.rmd") 时,option2 块运行,因为我添加的wd 设置为mypath/testknit/scripts。但是如果我打开.rmd 文件并运行所有块,wd 被设置为根目录mypath/testknit,并且 option1 块运行。你知道为什么wdmaster.R运行knit("scripts/test.rmd")时从mypath/testknit变为mypath/testknit/scripts吗?
  • 也许您可以使用normalizePath('../') 使../ 成为绝对路径。相对工作目录可能会令人困惑(至少在我阅读了太多级别的相对路径后我的头疼:)。顺便说一句,当您在 RStudio 中编写 HTML 时,RStudio 首先将工作目录更改为输入 Rmd 文件。
  • 没问题。只要让我知道这个在黑暗中的盲目射击是否有效:)
  • 是的!仅使用opts_knit$set(root.dir=normalizePath('../')) 可用于从master.R 编织.rmd 文件并编织为html 或从.rmd 中运行所有块。我更新了 github 示例。 test-b.rmd 现在显示这个。谢谢!如果您创建答案,我会选择它。

标签: r knitr


【解决方案1】:

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

我:是的!仅使用opts_knit$set(root.dir=normalizePath('../')) 可用于从master.R 编织.rmd 文件并编织为html 或从.rmd 中运行所有块。我更新了github exampletest-b.rmd 现在显示这个。谢谢!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-07
    • 1970-01-01
    • 2017-03-05
    • 2015-05-27
    • 2017-06-02
    相关资源
    最近更新 更多