2015-03-10 2 views
-1

Есть ли в R пакет или функция, которая может скачивать файлы и поддерживать регулярное выражение типа wget в linux?Скачивание файлов с использованием регулярного выражения в R-языке

Я просто хочу загрузить некоторые файлы cel из GEO. Но некоторый файл закончился cel.gz, другие закончились CEL.gz. У меня есть идентификатор GSM, например GSM107523. Я хочу, чтобы функция могла загрузить файл с именем GSM107523.cel.gz или GSM107523.CEL.gz. В Gererally я использую download.file для загрузки файлов.

Например: ftp://ftp.ncbi.nlm.nih.gov/geo/samples/GSM107nnn/GSM107523/suppl/GSM107523.cel.gz ftp://ftp.ncbi.nlm.nih.gov/geo/samples/GSM153nnn/GSM153499/suppl/GSM153499.CEL.gz

+0

Я не понял, что это был геном сайт, прежде чем я отправил свой ответ. Вы захотите изучить пакет BioConductor и BioQuery –

+0

@RichardScriven Нет, мне нужно загрузить этот файл GSM напрямую. GEOquery :: getGEO не может это сделать. –

+0

Я сделал редактирование. Надеюсь, он сработает для вас –

ответ

0

После выполнения некоторых шныряли по http://www.ncbi.nlm.nih.gov/, я пришел к выводу, что загрузка файлов через http будет намного быстрее. Вот что я придумал.

getGSMFile() будет, для всех строк в заданном x, либо вернуть пути к файлу, либо загрузить файлы. Вы можете установить этот параметр с помощью download. Если вы установили http = FALSE, он попытается загрузить ftp. Но имейте в виду, что это не помогло мне в нескольких попытках.

getGSMFile <- function (x, download = TRUE, http = TRUE, destfile, ...) 
{ 
    urlRoot <- "http://www.ncbi.nlm.nih.gov" 
    query <- sprintf("/geo/query/acc.cgi?acc=%s&targ=self&view=full&form=html", 
     x) 
    fullPath <- paste0(urlRoot, query) 
    linkList <- vapply(fullPath, function(x) { 
     links <- getHTMLLinks(x, 
      xpQuery = "//a/@href[contains(., 'cel') or contains(., 'CEL')]") 
     ftp <- grepl("ftp", links, fixed = TRUE) 
     URLdecode(if(http) paste0(urlRoot, links[!ftp]) else links[ftp]) 
    }, character(1L), USE.NAMES = FALSE) 
    if (!download) return(linkList) 
    for (link in linkList) download.file(link, destfile = destfile, ...) 
} 

А вот тест работает на двух ваших GSMs

x <- c("GSM107523", "GSM153499") 
getGSMFile(x, download = FALSE) 
# [1] "http://www.ncbi.nlm.nih.gov/geo/download/?acc=GSM107523&format=file&file=GSM107523.cel.gz" 
# [2] "http://www.ncbi.nlm.nih.gov/geo/download/?acc=GSM153499&format=file&file=GSM153499.CEL.gz" 

tmp <- tempfile() 
getGSMFile(x, destfile = tmp) 
# trying URL 'http://www.ncbi.nlm.nih.gov/geo/download/?acc=GSM107523&format=file&file=GSM107523.cel.gz' 
# Content type 'application/octet-stream' length 3960200 bytes (3.8 Mb) 
# opened URL 
# ================================================== 
#  downloaded 3.8 Mb 
# 
# trying URL 'http://www.ncbi.nlm.nih.gov/geo/download/?acc=GSM153499&format=file&file=GSM153499.CEL.gz' 
# Content type 'application/octet-stream' length 3208938 bytes (3.1 Mb) 
# opened URL 
# ================================================== 
#  downloaded 3.1 Mb 
+0

'url.exists' - это способ справиться с этим. Есть ли способ понравиться 'wget www.xxxx. *. Gz' в R (* будет представлять cel или CEL)? Спасибо. –

+0

Я сделал небольшое редактирование. Функция 'getHTMLLinks' - это XML-файл и разумно дешифрует файл download.file. Есть ли какие-либо слова в http://www.ncbi.nlm.nih.gov/ относительно скорости http и ftp? Кажется, что проще реализовать код. –

0

Да, вы можете использовать grepl. Учитывая вектор строк, он вернет TRUE, если строка соответствует регулярному выражению и FALSE в противном случае.

vector_strings <- c("a.cel.gz", "a.CEL.gz", "a.txt") 
grepl("[cel|CEL].gz$", vector_strings) 
+0

Как его скачать? потому что я не знаю, что такое суффикс файла. –

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