0

最好不要在R中使用“for循环,while循环”,我想用两种方法从网上下载一个url:

1.使用for循环

url1="http://stat.ethz.ch/R-manual/R-devel/library/base/html/connections.html"
url2="http://en.wikipedia.org/wiki/Xz"
url=c(url1,url2)
dw=c("test1","test2")
for (i in 1:2){download.file(url[i],destfile=dw[i])}

如何将“for loop”方法更改为“apply”方法?

2.使用 RCurl

require(RCurl)
urls = c("http://stat.ethz.ch/R-manual/R-devel/library/base/html/connections.html", "http://en.wikipedia.org/wiki/Xz")
txt = getURIAsynchronous(urls)

网址包含数千个网址怎么样?如果 url 包含 10000 个网址,则没有足够的内存或磁盘空间...

4

2 回答 2

3

您可以使用mapply

urls <- rep('http://stackoverflow.com/questions/12169074/download-from-web',2) 
destfiles <- paste0('test',1:2,'.html')

mapply(download.file, url = urls, destfile = destfiles)

类似的方法应该适用RCurl,尽管由于防火墙/代理限制,我无法对此进行测试

于 2012-08-29T00:01:56.963 回答
2

关于您的 for 循环问题,您可以使用以下内容:

sapply(seq_along(url), function(n) download.file(url[n], dw[n])

这与您的 for 循环非常相似。或者@mnel 有一个很好的解决方案mapply。但是,在这种情况下,不赞成使用 for 循环。事实上,在 R 中有许多编写 for 循环的方法并不慢。R Inferno 对此有很好的部分。

最短的答案是,只要输出是预先分配的而不是在循环期间增长,R 中的 for 循环就可以了。

至于您的RCurl问题,如果您遇到内存错误,您有两个选择。1.获取更多内存。或者 2. 分块下载数据并将其写入磁盘,然后再下载更多。

于 2012-08-29T00:05:45.433 回答