2013-01-24 70 views
4

我在R中有一個簡單的函數,它通過lapply()在我指定的目錄中的許多CSV上運行summary()。功能如下所示:在R中傳遞目錄路徑作爲參數

# id -- the file name (i.e. 001.csv) so ID == 001. 
# directory -- location of the CSV files (not my working directory) 
# summarize -- boolean val if summary of the CSV to be output to console. 
getMonitor <- function(id, dir, summarize = FALSE) 
{ 
    fl <- list.files(dir, pattern = "*.csv", full.names = FALSE) 

    fdl <- lapply(fl, read.csv) 

    dataSummary <- lapply(fdl, summary) 

    if(summarize == TRUE) 
    { dataSummary[[id]] } 
} 

當我試圖指定的目錄,然後將其作爲參數傳遞給函數,像這樣:

dir <- "C:\\Users\\ST\\My Documents\\R\\specdata" 
funcVar <- getMonitor("001", dir, FALSE) 

我收到的錯誤:

文件錯誤(文件「rt」):無法打開連接。另外:警告消息: 在文件(文件,「RT」):無法打開文件「001.csv」:沒有這樣的文件或目錄

然而,當我在自己的運行下面的代碼:

fl <- list.files("C:\\Users\\ST\\My Documents\\R\\specdata", 
        pattern = "*.csv", 
        full.names = FALSE) 
fl[1] 

它找到目錄我指向和FL [1]正確輸出[1]「001.csv」這是列出的第一個文件。

我的問題是當我試圖將這個路徑變量作爲參數傳遞給我的函數時,我做錯了什麼。 R不能以這種方式處理參數嗎?有什麼我只是完全失蹤?我嘗試過四處搜尋,並熟悉其他編程語言,所以坦率地說,我現在感覺有點愚蠢/失敗了。

+0

在讀取csv文件之前放置一個'browser()'語句,並檢查'fl'的內容。 –

+1

你提供給'list.files''pattern'參數的東西不是你想象的那樣。正確的模式將是''\\。csv $''。你現在所說的「匹配零個或多個空字符,後跟任何字符和字母csv」,這將比僅以'.csv'結尾的文件更多地匹配。在這種模式下,你認爲這是'Sys.glob'的意思。例如,你可以執行'Sys.glob(file.path(dir,'* .csv'))''。 –

+0

爲什麼這個問題一遍又一遍地出現?如果您搜索「r」問題和「getmonitor」,您會在上週發現五個問題! – rrs

回答

7

您將fl[1]直接傳遞到read.csv與資格的路徑。相反,如果您使用​​,則會得到完整路徑,並且您的步驟將正常工作。但是,您需要做一些小小的工作,以使您的if聲明再次發揮作用。

您還可以擴大你的lapply功能粘貼的目錄和文件名一起:

fdl <- lapply(fl, function(x) read.csv(paste(dir, x, sep='\\'))) 

或在單獨一行創建此粘貼完整路徑:

fl.qualified <- paste(dir, fl, sep='\\') 
fdl <- lapply(fl.qualified, read.csv) 

當你做對paste步驟,如果你想要非常明確,我會鼓勵regex以確保你沒有人通過一個尾部的斜槓目錄:

fl.qualified <- paste(gsub('\\\\$', '', dir), f1, sep='\') 

或沿着這些線。

+0

full.names = TRUE爲我工作,雖然我想玩弄你的其他解決方案,所以我變得更加了解這方面的知識。謝謝! – SMT

+0

你是對的,但我現在必須調整if語句。感謝幫助! – SMT