Как я могу справиться с ошибкой в ​​итерационном процессе в R? - PullRequest
0 голосов
/ 21 января 2019

У меня проблема с ошибкой в ​​цикле for.

В приведенном ниже коде я хочу очистить таблицы данных и объединить их в один кадр данных.

Во время веб-очистки некоторые адресные ссылки не работают, и веб-очистка останавливается и заканчивается в середине процесса очистки. (местоположение ошибки: doc = read_html (i, encoding = 'UTF-8')

Как мне перейти к следующему процессу очистки и завершить итерацию для всего вектора, игнорируя ошибочную ссылку?

fdata = data.frame()
n = 1
for (i in data$address) {
  doc = read_html(i, encoding = 'UTF-8')
  dtable = doc %>% 
    html_table()
  fdata = bind_rows(fdata, dtable)
  len = length(data$address)
  print(n/len*100)
  n = n + 1
}

Ответы [ 2 ]

0 голосов
/ 21 января 2019

Вы также можете использовать possibly из purrr для возврата NA при ошибках, создать функцию для очистки таблицы, затем выполнить итерацию и связать с map_dfr

library(purrr)
library(rvest)

read_possible <- posibly(read_html, NA)

scrape_table <- function(address) {

  doc <- read_possible(address, encoding = 'UTF-8')

  if (is.na(doc)) {
    NA
  } else  {
    html_table(doc)
  }

}

map_dfr(data$address, scrape_table)
0 голосов
/ 21 января 2019

Просто добавьте try в сочетании с if error next, например,

fdata = data.frame()
n = 1
for (i in data$address) {
  doc = try(read_html(i, encoding = 'UTF-8'), silent = TRUE)
  if (any(class(doc) == 'try-error')) next
  dtable = doc %>% 
    html_table()
  fdata = bind_rows(fdata, dtable)
  len = length(data$address)
  print(n/len*100)
  n = n + 1
}
...