Для части 1 может быть полезен RCurl. Функция getURL
извлекает один или несколько URL; dirlistonly
перечисляет содержимое каталога без извлечения файла. Остальная часть функции создает следующий уровень URL
library(RCurl)
getContent <- function(dirs) {
urls <- paste(dirs, "/", sep="")
fls <- strsplit(getURL(urls, dirlistonly=TRUE), "\r?\n")
ok <- sapply(fls, length) > 0
unlist(mapply(paste, urls[ok], fls[ok], sep="", SIMPLIFY=FALSE),
use.names=FALSE)
}
Итак, начиная с
dirs <- "ftp://prism.oregonstate.edu//pub/prism/pacisl/grids"
мы можем вызвать эту функцию и искать вещи, которые похожи на каталоги, продолжая до тех пор, пока не будет сделано
fls <- character()
while (length(dirs)) {
message(length(dirs))
urls <- getContent(dirs)
isgz <- grepl("gz$", urls)
fls <- append(fls, urls[isgz])
dirs <- urls[!isgz]
}
мы могли бы затем использовать getURL
снова, но на этот раз на fls
(или элементах fls
в цикле), чтобы получить фактические файлы. Или, может быть, лучше открыть URL-соединение и использовать gzcon для распаковки и обработки файла. По линии
con <- gzcon(url(fls[1], "r"))
meta <- readLines(con, 7)
data <- scan(con, integer())