【问题标题】:R curl::has_internet() FALSE even though there are internet connectionR curl::has_internet() FALSE 即使有互联网连接
【发布时间】:2020-01-19 01:46:19
【问题描述】:

使用 R 包 eurostat 从 EuroSTAT 下载数据时出现了问题:

# 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!

Seaching,我发现它是语句(在 eurostat-package 代码中): if (curl::has_internet() {stop("You have no inernet connection, please connnect") 导致问题。

但是,我有互连,可以例如ping www.eurostat.eu

我在不同的计算机上尝试了curl::has_internet(),所有计算机都连接了互联网。在某些情况下它可以工作(响应 TRUE),而在其他情况下则不行。

我已经与我们的 IT 部门进行了交谈,我们尝试过是否可能是防火墙问题。删除防火墙,并没有解决问题。

不幸的是,我对网络设置一无所知。因此,当我尝试阅读 curl-package 的文档时,我迷路了。

使用上述命令从 EuroSTAT 下载数据至少已经运行了 2 年,对我来说,问题出现在 2020 年初(1 月 7 日)。

希望有人能提供帮助,因为从 EuroSTAT 下载人口数据是我/我们日常工作中的一个强制性部分。

【问题讨论】:

标签: r


【解决方案1】:

curl::has_internet这个特殊情况下,不需要修改函数来返回特定的值。它有自己的封闭环境,从中读取指示代理连接是否存在的状态变量。您可以改为修改该状态变量。

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

curl::has_internet()  # will always be TRUE
# [1] TRUE

【讨论】:

    【解决方案2】:

    不知道您的设置很难判断,但有几件事可以尝试。此问题已被注意到,并且可能在您可以安装的开发版本中得到解决

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

    您也可以尝试updating 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(),在 R 会话的剩余时间里,任何对 curl::has_internet() 的调用都将返回 TRUE。但是,这仅在其他 curl 功能与您的网络设置正常工作时才有效。如果不是,那么您将收到其他奇怪的错误,应该放弃这种方法。

    如果出于任何原因,您希望在不重新启动 R 会话的情况下恢复原始 curl::has_internet 的功能,您可以这样做:

    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"))
    }
    

    【讨论】:

      【解决方案3】:

      感谢两位的快速回复,

      assign("has_internet_via_proxy", TRUE, environment(curl::has_internet)) 和函数 remove_has_internet() 都解决了我的问题。

      很遗憾,安装 curl 的开发版本并没有帮助。

      此外,函数 restore_has_internet() 不会重置回原来的 curl::has_internet()。运行 remove_has_internet() 后,curl::has_internet() 给出 TRUE。如果我然后运行 ​​restore_has_internet(),curl::has_internet() 仍然返回 TRUE。

      【讨论】:

        猜你喜欢
        • 2017-04-09
        • 2015-01-02
        • 1970-01-01
        • 1970-01-01
        • 2017-03-14
        • 1970-01-01
        • 2019-06-05
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多