R:使用try()进行异常处理

时间:2017-01-06 11:42:20

标签: r try-catch

我有一个存储在对象FILELIST中的15个文件的列表。任务是从特定目录中读取FILELIST中的所有文件,并在另一个下面附加一个文件。

在下面的代码中,对象名为' dataset'将有最后的附加文件。我面临的问题是如果目录中不存在FILELIST中的一个或多个文件,我收到如下错误。我需要的是,如果目录中不存在15个文件中的一个或多个,则代码应继续附加其余文件。

我尝试使用try异常处理方法,但仍然遇到错误,代码也没有处理其余的文件。

文件错误(文件," rt"):无法打开连接 另外:警告信息: 在文件(文件," rt")中:   无法打开文件' PREDICTION_2016_Q4_Wk13.csv':没有这样的文件或目录

代码:

for (file in FILELIST) {
  try(    
    if (!exists("dataset")) {
      dataset <- read.table(file, header=TRUE, sep=",")
    }
    if (exists("dataset")) {
      temp_dataset <-read.table(file, header=TRUE, sep=",")
      dataset<-rbind(dataset, temp_dataset)
      rm(temp_dataset)
    },
    silent = T
  )
} 

3 个答案:

答案 0 :(得分:0)

我不会为此使用异常处理。而是做这样的事情:

for (file in intersect(FILELIST, list.files())) {

答案 1 :(得分:0)

首先使用file.existsFilterFILELIST缩减为现有的rbind,然后在结尾处阅读每个FILELISTFILELIST

请注意,这适用于do.call("rbind", lapply(Filter(file.exists, FILELIST), read.csv)) 包含当前目录中文件名的情况,如果文件位于其他位置并且background-size: 100%;中指定了路径/文件名,则也可以。

没有使用任何包裹。

$logger = new StreamHandler(__DIR__.'/my_app.log');
$logger->setFormatter( new JsonFormatter() );
$logger->pushHandler($logger);

更新:改进了代码。

答案 2 :(得分:0)

另外两个答案的组合,使用readr + dplyr获取速度:

library(dplyr)
library(readr)

# existing files
f <- intersect(FILELIST, list.files())

# or identically:
# f <- intersect(FILELIST, dir())
# f <- FILELIST[ file.exists(FILELIST) ]

# combine in a single dataset
d <- bind_rows(lapply(f, read_csv))