Как мне получить R, чтобы сказать мне, какие ссылки не работают при загрузке файлов? - PullRequest
0 голосов
/ 15 апреля 2020

У меня есть список ссылок на файлы 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) {})
    }

Однако некоторые ссылки не работают, и мне нужно знать, какие они есть. В идеале я хотел бы получить вывод, который заполняет пустой вектор символом NA каждый раз, когда tryCatch встречает неработающую ссылку. Другими словами, в дополнение к загрузке файлов я получу вывод, который выглядит следующим образом:

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)

Кто-нибудь знает, как я могу это сделать? Заранее спасибо за помощь!

Ответы [ 2 ]

1 голос
/ 15 апреля 2020

Вот еще одно решение с использованием map и safely из 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'>
1 голос
/ 15 апреля 2020

Поскольку мертвые ссылки выдают предупреждение, а не ошибку, нам нужно перехватить предупреждение. Нам также нужно назначить вывод блока tryCatch для отслеживания результатов:

out <- rep(NA, length(urls))
for (i in seq_along(urls)) {
  out[i] <- tryCatch(
    {download.file(urls[i], paste0('~/Desktop/', basename(urls[i])))}, 
    error = function(e) {},
    warning = function(w) {NA}
  )
}

out
# [1]  0  0  0  0 NA

which(is.na(out))
# [1] 5
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...