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

8

我有一个简单的R函数,它通过lapply()来运行summary(),处理我指定目录下的许多CSV文件。该函数如下所示:

#   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)

我收到了以下错误:

文件(file, "rt")中的错误: 无法打开连接。 另外:警告信息: 在文件(file, "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 无法以这种方式处理参数吗?我是否完全忽略了什么?我尝试过搜索并熟悉其他编程语言,所以说实话,我感到有点愚蠢/失败,因为现在被卡住了。

在读取 csv 文件前加入 browser() 语句,并检查 fl 的内容。 - Paul Hiemstra
1
你提供给 list.filespattern 参数并不是你想要的。正确的模式应该是 '\\.csv$'。现在你所拥有的模式意味着“匹配零个或多个空字符,后跟任何字符和字母 csv”,这将匹配远不止以 .csv 结尾的文件。当使用 Sys.glob 时,这种模式就是你想要的。例如,你可以执行 Sys.glob(file.path(dir, '*.csv')) - Matthew Plourde
为什么同样的问题一遍又一遍地出现?如果你搜索r相关问题并且搜索"getmonitor",你会发现在过去的一周里有五个相同的问题! - rrs
@rrs 我在发帖之前尝试过搜索解决方案!如果我没有看到那些帖子并创建了重复的帖子,我很抱歉。 - Stephen Tetreault
这让我想知道这是否是一项作业任务。 - rrs
1
@rrs 这不是一项家庭作业任务。我正在完成一些编程作业,来尝试快速掌握 R 语言以便于我的工作。这些作业来自 Coursera 的在线课程。 - Stephen Tetreault
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)

当你进行“粘贴”操作时,如果想要更加明确,我建议使用正则表达式regex,以确保你不会将带有尾部斜杠的目录传递给其他人:

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

或类似的东西。


full.names = TRUE 对我有用,但我想尝试一下你的其他解决方案,以便更加了解这个问题。谢谢! - Stephen Tetreault
你说得对,我现在必须调整if语句。感谢你的帮助! - Stephen Tetreault
我正在尝试使用lapply读取目录中的多个csv文件,您解释的方法对我来说可以正常工作,但是一旦我尝试以下代码,我就会收到“Error in file(file,“rt”):无法打开连接”的错误。有什么想法如何修复它?以下是我的代码:`pred <- function(m, dir, input1, input2, input3, output){fl <- list.files(dir, pattern = "*.csv", full.names = FALSE) fdl <- lapply(fl, function(x) read.csv(paste(dir, x, sep='\')))d1 <- read.csv(input1, header = TRUE) d2 <- read.csv(input2, header = TRUE) d3 <- read.csv(input3, header = TRUE)` - Mojgan Mazouchi

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接