После выполнения некоторых шныряли по 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
Я не понял, что это был геном сайт, прежде чем я отправил свой ответ. Вы захотите изучить пакет BioConductor и BioQuery –
@RichardScriven Нет, мне нужно загрузить этот файл GSM напрямую. GEOquery :: getGEO не может это сделать. –
Я сделал редактирование. Надеюсь, он сработает для вас –