将目录路径作为R中的参数传递

时间:2013-01-24 18:33:43

标签: 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)

我收到错误:

文件错误(文件,&#34; rt&#34;):无法打开连接。另外:警告信息: 在文件(文件,&#34; rt&#34;)中:无法打开文件&#39; 001.csv&#39;:没有这样的文件或目录

然而,当我自己运行以下代码时:

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

找到我指向的目录, fl [1] 正确输出 [1]&#34; 001.csv&#34; ,这是列出的第一个文件。

我的问题是在尝试将此路径变量作为参数传递给我的函数时,我做错了什么。 R无法以这种方式处理参数吗?我有什么东西完全不见了吗?我已经尝试过四处搜索并熟悉其他编程语言,所以,坦率地说,我现在感到有点愚蠢/失败。

1 个答案:

答案 0 :(得分:9)

您正在使用限定路径将fl[1]直接传递给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='\')

或类似的东西。