我会首先尝试抓取相关数据文件的链接,并使用生成的信息来构建包含用户登录等的完整下载路径。正如其他人所建议的那样,lapply
批量下载会很方便。
这是一种提取 URL 的简单方法。显然,修改示例以适合您的实际情况。
在这里,我们将使用该XML
包来识别 Amelia 包 ( http://cran.r-project.org/src/contrib/Archive/Amelia/ ) 的 CRAN 档案中的所有可用链接。
> library(XML)
> url <- "http://cran.r-project.org/src/contrib/Archive/Amelia/"
> doc <- htmlParse(url)
> links <- xpathSApply(doc, "//a/@href")
> free(doc)
> links
href href href
"?C=N;O=D" "?C=M;O=A" "?C=S;O=A"
href href href
"?C=D;O=A" "/src/contrib/Archive/" "Amelia_1.1-23.tar.gz"
href href href
"Amelia_1.1-29.tar.gz" "Amelia_1.1-30.tar.gz" "Amelia_1.1-32.tar.gz"
href href href
"Amelia_1.1-33.tar.gz" "Amelia_1.2-0.tar.gz" "Amelia_1.2-1.tar.gz"
href href href
"Amelia_1.2-2.tar.gz" "Amelia_1.2-9.tar.gz" "Amelia_1.2-12.tar.gz"
href href href
"Amelia_1.2-13.tar.gz" "Amelia_1.2-14.tar.gz" "Amelia_1.2-15.tar.gz"
href href href
"Amelia_1.2-16.tar.gz" "Amelia_1.2-17.tar.gz" "Amelia_1.2-18.tar.gz"
href href href
"Amelia_1.5-4.tar.gz" "Amelia_1.5-5.tar.gz" "Amelia_1.6.1.tar.gz"
href href href
"Amelia_1.6.3.tar.gz" "Amelia_1.6.4.tar.gz" "Amelia_1.7.tar.gz"
为了演示,假设最终我们只需要 1.2 版本的包的链接。
> wanted <- links[grepl("Amelia_1\\.2.*", links)]
> wanted
href href href
"Amelia_1.2-0.tar.gz" "Amelia_1.2-1.tar.gz" "Amelia_1.2-2.tar.gz"
href href href
"Amelia_1.2-9.tar.gz" "Amelia_1.2-12.tar.gz" "Amelia_1.2-13.tar.gz"
href href href
"Amelia_1.2-14.tar.gz" "Amelia_1.2-15.tar.gz" "Amelia_1.2-16.tar.gz"
href href
"Amelia_1.2-17.tar.gz" "Amelia_1.2-18.tar.gz"
您现在可以按如下方式使用该向量:
wanted <- links[grepl("Amelia_1\\.2.*", links)]
GetMe <- paste(url, wanted, sep = "")
lapply(seq_along(GetMe),
function(x) download.file(GetMe[x], wanted[x], mode = "wb"))
更新(在评论中澄清您的问题)
上面示例中的最后一步将指定的文件下载到您当前的工作目录(用于getwd()
验证该目录的位置)。相反,如果您确定read.csv
对数据有效,您还可以尝试修改匿名函数以直接读取文件:
lapply(seq_along(GetMe),
function(x) read.csv(GetMe[x], header = TRUE, sep = "|", as.is = TRUE))
但是,我认为更安全的方法可能是首先将所有文件下载到单个目录中,然后使用read.delim
orread.csv
或其他任何方法来读取数据,类似于@Andreas 建议的那样。我说更安全,因为它在文件未完全下载等情况下为您提供了更大的灵活性。在这种情况下,您不必重新下载所有内容,只需下载未完全下载的文件。