2013-06-25 47 views
2

我寫了一個不同函數和腳本的列表,我將它們放在工作目錄的一些子文件夾中,以便我可以將所有函數劃分爲參數(描述性統計量,地統計量,迴歸....)R中的多個工作目錄

當我鍵入源(「function_in_subfolder」)R告訴我,沒有功能。 我明白,這是因爲函數必須留在工作目錄中。 有沒有辦法將工作目錄的子文件夾也設置爲函數的源代碼(讓我們以分層的方式說)?

+1

當然,'source(「./subdir/function_name.R」)'。 「」將路徑定位到當前目錄,其餘部分應該是自我解釋的。 –

+1

請不要將函數(使用R腳本中的'function'關鍵字創建的對象)與源文件(R腳本本身)混淆。 – krlmlr

回答

5

source function有一個chdir參數,如果設置爲TRUE,它將把工作目錄設置爲腳本所在的目錄。新工作目錄在執行腳本的過程中有效,然後將其更改回來。 Assumung以下結構

main.R 
one/ 
    script.R 
    two/ 
    subscript.R 

你可以從main.R打電話source("one/script.R", chdir=T),在script.R,調用source("two/subscript.R", chdir=T)

但是,默認情況下,R將從當前目錄開始搜索。沒有像「搜索路徑列表」那樣的東西,例如PATH環境變量,儘管顯然someone attempted to create such a thing。我強烈建議不要試圖在「任何地方」找到腳本文件。相反,請準確指出在哪個點上運行哪個腳本。否則,僅僅將文件添加到腳本導致的名稱衝突可能會導致難以預料的行爲,而且這種行爲也很難調試。

+0

好吧,我明白了。實際上,調用工作子目錄中的函數的簡單方法是通過添加「。」來調用它們。 (源代碼(「./子目錄/ funtion_1.R)) – matteo

+0

@matteo:'。/'實際上並沒有改變任何東西,你可以省略它。 – krlmlr

+0

oops,你是對的。抱歉如果我看如此笨拙,但我從matlab單獨切換到R.在matlab中,我被用來保存主函數的子文件夾中的函數,當我需要它們時,我只需輸入函數的名稱。在RI中必須調用它們與源(「路徑」) – matteo

0

一個解決方案是使用list.files來獲取函數的完整路徑。例如:

myfunction.path <- list.files(getwd(), 
       recursive=TRUE,full.names=TRUE, 
       pattern='^myfunction.R$') 

然後,你可以把它叫做:

source(myfunction.path) 

list.files的遞歸調用可能很昂貴,所以也許你應該在你的開始調用一次分析,例如和存儲所有函數路徑在命名列表中。並且BE CAREFUL如果在2個不同的子目錄中創建具有相同名稱的2個源文件,結果不可能是唯一的。