R curl :: has_inte rnet () FALSE, хотя есть соединение inte rnet - PullRequest
0 голосов
/ 18 января 2020

Моя проблема возникла при загрузке данных из Евростата с использованием пакета Евростата R:

# Population data by NUTS3
pop_data <- subset(eurostat::get_eurostat("demo_r_pjangrp3", time_format = "num"),
                   (age == "TOTAL") & (sex == "T") & 
                   (nchar(trimws(geo)) == 5))[, c("time","geo","values")]

#Fejl i eurostat::get_eurostat("demo_r_pjangrp3", time_format = "num") : 
#  You have no internet connection, please reconnect!

При поиске, я обнаружил, что это утверждение (в коде пакета евростата): if (curl::has_internet() {stop("You have no inernet connection, please connnect"), что вызвать проблему.

Тем не менее, у меня есть соединение и может, например, пинг www.eurostat.eu

Я пробовал curl::has_internet() на разных компьютерах, все с подключением inte rnet. В некоторых случаях это работает (отвечайте «ИСТИНА»), в других - нет.

Я говорил с нашим ИТ-отделом, и мы пытались выяснить, может ли это быть проблемой брандмауэра. Снятие брандмауэра не решило проблему.

К сожалению, я не знаю сетевых настроек. Следовательно, при попытке прочитать документацию для curl-пакета я теряюсь.

Загрузка данных из EuroSTAT с помощью приведенной выше команды работала в течение последних как минимум 2 лет, и у меня проблема возникла с самого начала от 2020 г. (7 января).

Надеюсь, что кто-то может помочь с этим, так как загрузка данных о населении из Евростата является обязательной частью большей части моей / нашей обычной работы.

Ответы [ 3 ]

0 голосов
/ 18 января 2020

В особом случае curl::has_internet вам не нужно изменять функцию, чтобы она возвращала указанное значение c. У него есть собственная окружающая среда, из которой он читает переменную состояния, указывающую, существует ли прокси-соединение. Вместо этого вы можете изменить эту переменную состояния.

assign("has_internet_via_proxy", TRUE, environment(curl::has_internet))

curl::has_internet()  # will always be TRUE
# [1] TRUE
0 голосов
/ 18 января 2020

Спасибо вам обоим за быстрые ответы,

Оба назначают ("has_internet_via_proxy", TRUE, environment (curl :: has_inte rnet)) и функцию remove_has_inte rnet () решают мою проблему.

К сожалению, установка развивающей версии curl не помогла.

Кроме того, функция restore_has_inte rnet () не сбрасывается обратно в исходный curl :: has_inte rnet (). После запуска remove_has_inte rnet () curl :: has_inte rnet () возвращает TRUE. Если я затем выполню restore_has_inte rnet (), curl :: has_inte rnet () все равно вернет TRUE.

0 голосов
/ 18 января 2020

Трудно сказать, не зная ваших настроек, но есть несколько вещей, которые нужно попробовать. Эта проблема была замечена и, возможно, устранена в версии для разработки, которую вы можете установить с

install.packages("https://github.com/jeroen/curl/archive/master.tar.gz", repos = NULL)

Вы также можете попробовать обновить libcurl , то есть библиотеку C, для которой R Пакет действует как интерфейс R. Проблема, которую вы описываете, кажется более распространенной с более старыми версиями libcurl.

Если все остальное терпит неудачу, вы можете переписать функцию curl::has_internet следующим образом:

remove_has_internet <- function()
{
  unlockBinding(sym = "has_internet", asNamespace("curl"))
  assign("has_internet", function() return(TRUE), envir = asNamespace("curl"))
  lockBinding(sym = "has_internet", asNamespace("curl"))
}

Теперь, если вы запустите remove_has_internet(), любой вызов curl::has_internet() вернет TRUE до конца вашей R-сессии. Однако это будет работать только в том случае, если другие функции скручивания работают правильно с настройками вашей сети. Если это не так, вы получите другие странные ошибки и должны отказаться от этого подхода.

Если по какой-либо причине вы хотите восстановить функциональность исходного curl::has_internet без перезапуска сеанса R, вы можете сделать это:

restore_has_internet <- function()
{
  unlockBinding(sym = "has_internet", asNamespace("curl"))
  assign("has_internet", 
         function() {!is.null(nslookup("r-project.org", error = FALSE))},
         envir = asNamespace("curl"))
  lockBinding(sym = "has_internet", asNamespace("curl"))
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...