2013-11-09 63 views
3

比方說,我有一個名爲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.rmdtestknit/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.Rknit("scripts/test.rmd")時運行的所有數據塊。它有效,但感覺就像我採取了錯誤的做法。

+0

不知道,但爲什麼不通過在每個塊中添加'getwd()'調用來進一步檢測'.rmd'文件? –

+0

@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'? –

+0

也許你可以使用'normalizePath('../')''作爲'../'絕對路徑'。一個相對的工作目錄可能會引起混淆(至少在閱讀了太多的相對路徑之後,我的頭部會受到傷害:)。順便說一句,當您在RStudio中編織HTML時,RStudio會首先將工作目錄更改爲輸入Rmd文件。 –

回答

3

@易輝:也許你可以用normalizePath('../')製作../絕對路徑。一個相對的工作目錄可能會引起混淆(至少在閱讀了太多的相對路徑之後,我的頭部會受到傷害:)。順便說一句,當您在RStudio中編織HTML時,RStudio會首先將工作目錄更改爲輸入Rmd文件。

我:是的!僅使用opts_knit$set(root.dir=normalizePath('../'))適用於編織master.R.rmd文件,並編織爲html或運行.rmd內的所有塊。我更新了github exampletest-b.rmd現在顯示這一點。謝謝!