8

我在 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不能以这种方式处理参数吗?有什么我完全想念的吗?我已经尝试过四处搜索并且熟悉其他编程语言,所以坦率地说,我现在陷入困境感到有点愚蠢/失败。

4

1 回答 1

11

您将通过排位赛路径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='\')

或类似的规定。

于 2013-01-24T18:39:30.160 回答