首页 > 解决方案 > 下载文件时如何让 R 告诉我哪些链接损坏?

问题描述

我有一个指向 PDF 文件的链接列表,如下所示:

df$urls <- c("http://www.frbsf.org/publications/economics/letter/2012/el2012-15.pdf", "http://research.stlouisfed.org/publications/es/11/ES1134.pdf", "http://www.frbsf.org/publications/economics/papers/2011/wp11-18bk.pdf", "https://www.minneapolisfed.org/research/sr/sr540.pdf", "brokenlink.pdf")

我有一个脚本,可以将这些文件中的每一个下载到一个文件夹中,如下所示:

urls <- df$urls
for (url in urls) {
    tryCatch({download.file(url, paste0('~/Desktop/Dataset/Folder', basename(url)))}, error = function(e) {})
    }

但是,有些链接不起作用,我需要知道它们是哪些。理想情况下,每次 tryCatch 遇到断开的链接时,我都会得到一个用 NA 填充空向量的输出。换句话说,除了下载文件之外,我还会得到如下所示的输出:

urls <- c("http://www.frbsf.org/publications/economics/letter/2012/el2012-15.pdf", "http://research.stlouisfed.org/publications/es/11/ES1134.pdf", "http://www.frbsf.org/publications/economics/papers/2011/wp11-18bk.pdf", "https://www.minneapolisfed.org/research/sr/sr540.pdf", "brokenlink.pdf")
output <- c("", "", "", "", NA)

有谁知道我该怎么做?在此先感谢您的帮助!

标签: r

解决方案


这是另一个使用mapand safelyfrom的解决方案purrr

library(purrr)
urls_list <- map(setNames(urls, urls), 
                    safely(~download.file(.x, paste0('~/Desktop/',basename(.x))))) 

Filter(function(x) is.null(x[['result']]), urls_list)

输出:

$brokenlink.pdf
$brokenlink.pdf$result
NULL

$brokenlink.pdf$error
<simpleError in download.file(.x, paste0(getwd(), "/", basename(.x))): scheme not supported in URL 'brokenlink.pdf'>

推荐阅读