2017-01-06 7 views
0

У меня есть список из 15 файлов, хранящихся в объекте FILELIST. Задача состоит в том, чтобы прочитать все файлы с FILELIST из определенного каталога и добавить один ниже другого.R: Обработка исключений с помощью try()

В приведенном ниже коде объект, называемый 'dataset', будет иметь окончательный файл. Проблема, с которой я столкнулся, заключается в том, что один или несколько файлов, присутствующих в FILELIST, отсутствуют в каталоге, я получаю сообщение об ошибке, как показано ниже. Мне нужно, если в каталоге нет 1 или более из 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 
) 
} 
+0

Поскольку все решения ниже предполагают, вы должны потерять 'for' петлю здесь, и вам не понадобится' try' вызов , Кроме того, если ваши файлы содержат некоторые столбцы, которые будут интерпретироваться как факторы, ожидайте медленного выполнения, чем если бы вы установили 'stringsAsFactors'' FALSE'. –

ответ

0

Я бы не использовать обработку этого исключения. Вместо того, чтобы сделать что-то вроде этого:

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

Благодарим вас за поддержку. Он работал хорошо. – guptaraviraj

0

file.exists Первое использование и Filter для снижения FILELIST на те, которые существуют, а затем прочитать каждый из них и rbind их вместе в конце.

Обратите внимание, что это работает как в ситуации, когда FILELIST содержит имена файлов из текущего каталога, а также работает, если файлы находятся в другом месте, а путь/имена файлов указаны в FILELIST.

Пакеты не используются.

do.call("rbind", lapply(Filter(file.exists, FILELIST), read.csv)) 

Update: Улучшен код.

+0

«Пакеты не используются» :-P –

+0

Благодарим вас за поддержку. Он работал хорошо. – guptaraviraj

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)) 
+0

Благодарим вас за поддержку. Он работал хорошо. – guptaraviraj

Смежные вопросы