3

という名前のプロジェクト ディレクトリがあり(MRE についてはgithubtestknitを参照してください)、この中にいくつかのサブディレクトリがあり、保持する場所やファイルを含むとします。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.rmdtestknit/scriptsknit("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 は私のルート ディレクトリが実際には 1 レベル上にあることを認識します。

test.rmdRStudio で開いて をクリックknit HTMLすると、予想どおり、チャンクはoption1機能しますが、option2チャンクは機能しません。

しかし、ファイル内から編むのではなく、test.rmd実行knit("scripts/test.rmd")して編もうとすると、どちらのチャンク オプションも機能しません。どちらも、その名前のファイルがないというエラーを返します。master.R.rmd

私は何を間違っていますか?マスターからファイルをtestsource2.R編成するときにR が見つからないのはなぜですか?.rmd.R

再現可能な例については、上記の github リンクを参照してください。

アップデート:

以下のコメントで指摘したように、wd <- getwd()直前に追加してみて、 にopts_knit$set変更(root.dir='../')しました(root.dir=wd)。したがって、 から実行knit("scripts/test.rmd")すると、追加した が に設定されるmaster.Rため、option2 チャンクが実行されます。しかし、ファイルを開いてすべてのチャンクを実行すると、 がルート ディレクトリに設定され、option1 チャンクが実行されます。wdmypath/testknit/scripts.rmdwdmypath/testknit

プロジェクトのルートを維持するには、作業ディレクトリが必要です。これは私にはエレガントな解決策のようには思えませんが、次のように変更します。

```{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