我在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无法以这种方式处理参数吗?我有什么东西完全不见了吗?我已经尝试过四处搜索并熟悉其他编程语言,所以,坦率地说,我现在感到有点愚蠢/失败。
答案 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='\')
或类似的东西。