Как закрыть неиспользуемые соединения после read_html в R

Я новичок в R и пытаюсь получить доступ к некоторой информации в Интернете, но у меня проблемы с подключениями, которые, похоже, не закрываются. Я был бы очень признателен, если бы кто-нибудь здесь дал мне совет ...

Первоначально я хотел использовать пакет WebChem, который теоретически предоставляет все, что я хочу, но когда некоторые выходные данные отсутствуют на веб-странице, WebChem не возвращает никаких данных с этой страницы. Чтобы обойти это, я взял большую часть кода из пакета, но немного изменил его в соответствии со своими потребностями. Это работало нормально примерно в течение первых 150 использований, но теперь, хотя я ничего не изменил, когда я использую команду read_html, я получаю предупреждающее сообщение "закрытие неиспользуемого соединения 4 (http: ....." Хотя это только предупреждающее сообщение, read_html ничего не возвращает после создания этого предупреждения.

Я написал упрощенный код, приведенный ниже. Это та же проблема

Полное закрытие R (или даже перезагрузка моего ПК), похоже, не имеет значения - теперь предупреждающее сообщение появляется при втором использовании кода. Я могу запускать запросы по одному вне цикла без проблем, но как только я пытаюсь использовать цикл, ошибка возникает снова на второй итерации. Я попытался векторизовать код, и снова он вернул то же сообщение об ошибке. Я пробовал showConnections (all = TRUE), но получил соединения 0-2 только для stdin, stdout, stderr. Я попытался найти способы закрыть html-соединение, но я не могу определить URL-адрес как con, а close (qurl) и close (ttt) также не работают. (Возврат ошибок, связанных с отсутствием применимого метода для 'close', примененного к объекту класса "символ, и отсутствия применимого метода для 'close', применяемого к объекту класса" c ('xml_document', 'xml_node') ", соответственно)

Кто-нибудь знает, как закрыть эти связи, чтобы они не нарушили мой распорядок? Любые предложения будут очень приветствоваться. Спасибо!

PS: Я использую R версии 3.3.0 с RStudio версии 0.99.902.

CasNrs <- c("630-08-0","463-49-0","194-59-2","86-74-8","148-79-8")
tit = character()
for (i in 1:length(CasNrs)){
  CurrCasNr <- as.character(CasNrs[i])
  baseurl <- 'http://chem.sis.nlm.nih.gov/chemidplus/rn/'
  qurl <- paste0(baseurl, CurrCasNr, '?DT_START_ROW=0&DT_ROWS_PER_PAGE=50')
  ttt <- try(read_html(qurl), silent = TRUE)
  tit[i] <- xml_text(xml_find_all(ttt, "//head/title"))
}

person user6469960    schedule 15.06.2016    source источник
comment
На R-3.2.5 (win10_64) я не получаю ни предупреждений, ни ошибок. Можете ли вы попробовать это в R-3.2.5, чтобы посмотреть, сможете ли вы воспроизвести это там?   -  person r2evans    schedule 15.06.2016
comment
Я использую R 3.3.0 в OS X и не получаю ошибок. Вы также можете использовать цепочки lapply и %>% для дальнейшего упрощения вашей структуры, хотя я сомневаюсь, что это повлияет на предупреждение.   -  person alistaire    schedule 15.06.2016
comment
Подождите, у вас установлен curl? Согласно ?read_html, он будет использовать curl(), если он установлен, иначе url() соединение. Оба должны работать, правда, но попробовать стоит.   -  person alistaire    schedule 15.06.2016
comment
Спасибо за предложения. Я пробовал код в R-3.2.5, а также после установки curl. В обоих случаях это работало какое-то время, но после нескольких итераций я снова получил ошибку тесного соединения. Я также безуспешно использовал lapply в коде - здесь я разместил цикл, чтобы показать, что он работает для одного запуска, а не для нескольких.   -  person user6469960    schedule 16.06.2016
comment
Итак, мне показалось немного странным, что я могу вручную пройти через цикл, и все будет работать, но когда я использовал цикл, возникла ошибка соединения - единственная разница в том, насколько быстро я могу вручную пройти через цикл. Поэтому я попытался добавить паузу (в настоящее время 5 секунд) сразу после команды read_html, и теперь цикл также работает нормально (хотя и очень медленно). Кажется, просто не хватило времени, чтобы соединения закрылись должным образом или что-то подобное. В любом случае, теперь я могу просто запустить программу на ночь - это займет время, но, по крайней мере, она не сломается! Спасибо за вашу помощь!   -  person user6469960    schedule 16.06.2016
comment
Не могли бы вы опубликовать и принять ответ, чтобы удалить его из очереди вопросов?   -  person Artem    schedule 03.10.2018


Ответы (2)


Я не нашел хорошего ответа на эту проблему. Лучшее решение, которое я придумал, - это включить функцию ниже с Secs = 3 или 4. Я до сих пор не знаю, почему возникает проблема или как ее остановить, не создавая большой задержки.

CatchupPause <- function(Secs){
 Sys.sleep(Secs) #pause to let connection work
 closeAllConnections()
 gc()
}
person nm200    schedule 11.10.2018
comment
Это тоже было моим решением, до сих пор не могу найти ответа. Очень хотелось бы, чтобы для read_html была функция close () - person Bryan A; 04.06.2019

Изучив тему, я пришел к следующему решению:

  url <- "https://website_example.com"
  url = url(url, "rb")
  html <- read_html(url)
  close(url)

# + Whatever you wanna do with the html since it's already saved!
person Roberto de la Iglesia    schedule 01.01.2020
comment
Спасибо за такой ответ! Для меня это сработало. - person Andrew Brēza; 05.01.2021