如何在R的read.table()中跳过空文件

3
我希望使用R中的read.table读取一个文件夹中的大量文本文件,但是这些文本文件中有一些是空文件,在使用以下代码时会出现错误。
filenames<-list.files("M:/files/test1",pattern=".txt");
datalist<-lapply(filenames,function(name){
  read.table(paste("M:/files/test1/",name,sep=""),head=FALSE,stringsAsFactors=FALSE,sep="\t")
})

谢谢!! 或许我没有清楚地描述我的问题! 文本文件存在,但文本文件的内容是空白的。 我想知道如何在使用read.table时跳过这些类型的空白文件。 - Cheng
'在read.table(way, head = FALSE, stringsAsFactors = FALSE, sep = "\t")中出现错误:输入中没有可用的行 @Pascal' - Cheng
2个回答

5

最简单的方法是使用try添加一个简单的错误捕获机制:

datalist<-lapply(filenames,function(name){
  x <- try(read.table(paste("M:/files/test1/",name,sep=""),head=FALSE,stringsAsFactors=FALSE,sep="\t"))
  if(inherits(x, "try-error"))
    return(NULL)
  else
    return(x)
})

为了看到它的实际效果,可以尝试一个玩具示例。 try 所做的是返回该对象,如果出现错误,则返回一个包含错误详细信息的特殊对象类:

x <- try(stop("Test error"))
inherits(x, "try-error")
x
# [1] "Error in try(stop(\"Test error\")) : Test error\n"
# attr(,"class")
# [1] "try-error"
# attr(,"condition")
# <simpleError in doTryCatch(return(expr), name, parentenv, handler): Test error>

相比之下,如果你没有使用 try ,而是直接出现错误,程序将停止,x 将变成未定义的:

rm(x)
x <- stop("Test error")
# Error: Test error
x
# Error: object 'x' not found

如果在try()内操作成功,它将简单地返回正确的对象:

x <- try(1)
x
# [1] 1

3

跳过空文件

测试每个文件的大小,并跳过大小为0的文件

for (file in list.files(,"*.txt")){
    if (file.size(file) == 0) next
    print(file)
}

这会导致错误:Error in FUN(X[[i]], ...) : no loop for break/next, jumping to top level - Larry Cai

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