Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/date/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
从master.R文件编织.rmd时,在.rmd块中查找文件源时出现问题_R_Knitr - Fatal编程技术网

从master.R文件编织.rmd时,在.rmd块中查找文件源时出现问题

从master.R文件编织.rmd时,在.rmd块中查找文件源时出现问题,r,knitr,R,Knitr,假设我有一个名为testknit的项目目录(我有,请参见MRE),在这个目录中我有几个子目录,包括scripts,其中保存了.R和.rmd文件 在RStudio中,我创建了一个项目,并选择了这个testknit目录,这样当我打开项目时,工作目录就是mypath/testknit 在testknit/scripts内部,我有一个master.R文件。如果我想获得一个名为testsource1.R的文件,它也在testknit/scripts中,我可以从master.R中运行source(“scri

假设我有一个名为
testknit
的项目目录(我有,请参见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
test.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\u knit$set(root.dir='../')
,以便knitr知道我的根目录实际上是上一级的

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

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

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

有关可复制的示例,请参见上面的github链接

更新:


正如我在下面的评论中所指出的,我尝试添加
wd@Yihui:也许你可以使用
normalizePath('../')
创建一个绝对路径。一个相对工作目录可能会让人感到困惑(至少在我读了太多级别的相对路径之后,我的头会痛:)。顺便说一句,在RStudio中编织HTML时,RStudio首先将工作目录更改为输入Rmd文件


我:是的!只需使用
opts_knit$set(root.dir=normalizePath('../')
即可从
master.R
编织
.rmd
文件,并编织为html或运行
.rmd
中的所有块。我更新了<代码>test-b.rmd
现在显示了这一点。谢谢

不知道,但是为什么不通过在每个块中添加
getwd()
调用来进一步插入
.rmd
文件?@BenBolker,我添加了
wd,也许您可以使用
normalizePath('../')
创建一个绝对路径。一个相对工作目录可能会让人感到困惑(至少在我读了太多级别的相对路径之后,我的头会痛:)。顺便说一句,在RStudio中编织HTML时,RStudio首先将工作目录更改为输入Rmd文件。没问题。只要让我知道这个黑暗中的盲目射击是否有效:)是的!只需使用
opts_knit$set(root.dir=normalizePath('../')
即可从
master.R
编织
.rmd
文件,并编织为html或运行
.rmd
中的所有块。我更新了github示例<代码>test-b.rmd
现在显示了这一点。谢谢如果你创建了一个答案,我会选择它。
```{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)
```