2013-05-28 4 views
1

У меня есть несколько мест, которые могут содержать файл, который мне нужен.Как найти первый существующий файл в последовательности

Я хочу найти первый существующий файл в векторе.

Оба

find.existing.file <- function (files) { 
    present <- which(file.exists(files)) 
    stopifnot(length(present) > 0) 
    files[present[1]] 
} 

и

find.existing.file <- function (files) { 
    for (i in 1:length(files)) 
    if (file.exists(files[i])) 
     return(files[i]) 
    stop("None exist: ",paste(files,collapse=" ")) 
} 

должны делать то, что мне нужно.

Однако первая версия проверяет все файлы вместо возврата на первый существующий файл, а вторая использует цикл, который, я думаю, не очень «R'y».

Мне было интересно, отсутствует ли я что-то очевидное.

Спасибо.

+3

По характеру зверя это не является последовательной операцией, и если вы хотите, чтобы написать свой собственный 'C++ 'function, цикл, как в вашем втором решении, - это способ пойти (при условии, что у вас есть большое количество файлов для проверки). – eddi

ответ

2

здесь другой вариант с использованием регулярных выражений и list.files. Я предполагаю, что вы ищете список файлов в существующем каталоге.

function(listfiles,path) 
    length(grep(paste(listfiles,collapse='|'), 
       list.files(path))> 0 

EDIT после OP осветления:

Для поиска определенного файла во многом месте вы можете просто list.files с определенным рисунком. Например, для поиска файлов инициализации в/и т.д.,/USR/местные/и т.д.:

list.files(path= c('/etc','/usr/local/etc'), 
      pattern='init.*') 
+0

спасибо. на самом деле то, что я имел в виду, было больше похоже на поиск в нескольких местах для определенного файла (например, программа может искать свой файл инициализации в '/ etc', затем в'/usr/local/etc' и c.) – sds

+0

@sds вы можете увидеть мое редактирование. – agstudy

+0

круто, это еще более интересно. однако это все равно проверяет файлы, которые не будут использоваться. но это, по-моему, не имеет большого значения (если только один из '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' ''] – sds

1

Это выглядит "functional" достаточно:

find.existing.file <- function (files) 
    Find(file.exists,files,nomatch=stop("None exist: ",paste(files, collapse=" "))) 
Смежные вопросы