比方說,我有一個名爲testknit
項目目錄(而我呢,看到github爲MRE),並且這裏面我有幾個子目錄,包括scripts
我在那裏保留.R
和.rmd
文件。無法找到文件源從主.R文件進行編織時.rmd
在RStudio中,我創建了一個項目並選擇了這個目錄,這樣當我打開該項目時,工作目錄是mypath/testknit
。我有一個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
而不是編織從.rmd
文件內運行knit("scripts/test.rmd")
編織test.rmd
,既不塊選項的作用。兩者都返回一個錯誤,即沒有該名稱的文件。
我在做什麼錯?爲什麼在編織.R
的.rmd
文件時找不到testsource2.R
?
請參閱上面的github鏈接以獲取可重現的示例。
更新:
正如我在下面的評論指出,我嘗試了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 < - getwd()'。我不明白爲什麼,但現在當我從'master.R'運行'knit(「scripts/test.rmd」)'時,option2塊運行,因爲我添加的'wd'被設置爲'mypath/testknit/scripts'。但是如果我打開'.rmd'文件並運行所有塊,'wd'設置爲根目錄,'mypath/testknit',並且運行option1塊。你知道爲什麼當從'master.R'運行'knit(「scripts/test.rmd」)''時,'wd'從'mypath/testknit'變成'mypath/testknit/scripts'? –
也許你可以使用'normalizePath('../')''作爲'../'絕對路徑'。一個相對的工作目錄可能會引起混淆(至少在閱讀了太多的相對路徑之後,我的頭部會受到傷害:)。順便說一句,當您在RStudio中編織HTML時,RStudio會首先將工作目錄更改爲輸入Rmd文件。 –