簡體   English   中英

將目錄路徑作為R中的參數傳遞

[英]Passing directory path as parameter in R

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

#   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無法以這種方式處理參數嗎? 有什么東西我完全不見了嗎? 我已經嘗試過搜索並熟悉其他編程語言,所以,坦率地說,我現在感覺有點愚蠢/失敗。

你將fl[1]直接傳遞read.csv帶有限定路徑的read.csv 相反,如果你使用full.names=TRUE你將得到完整的路徑,你的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='\')

或類似的規定。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM