【问题标题】:How to get a ping response in R如何在 R 中获得 ping 响应
【发布时间】:2016-08-21 05:40:47
【问题描述】:

我有一个包含域名列的数据框。我想通过 ping 他们的域名来查看存在哪个域。我可以通过以下函数获得单独的 ping 响应。

ping <- function(x,stderr=FALSE,stdout=FALSE,...){
pingvec <- system2("ping",x,
                 stderr=FALSE,
                 stdout=FALSE,...)
if (pingvec == 0) TRUE else FALSE
}



ping("google.com")
[1] TRUE

是否有任何 R 包可以让我获得对包含数千个域名的整个列的 ping 响应。

【问题讨论】:

    标签: r


    【解决方案1】:

    使用system() 命令不是一个好主意 - 作为任何编程语言的一般规则。 main reasons 是安全性和可移植性问题。

    pingr 包提供了在 R 中 ping 远程服务器的可能性:

    library(pingr)
    URLs <- c("google.com", "yahoo.com")  
    sapply(URLs, ping)
    #     google.com yahoo.com
    #[1,]       14.6       171
    #[2,]       14.7       171
    #[3,]       14.6       171
    

    编辑/评论

    查看函数pingr::ping()pingr:::ping_os() 的源代码,似乎包确实使用了对system() 的调用。因此,我认为security concerns remain,因为可以重新定义操作系统功能ping 来做一些完全不同并且可能有害的事情。该软件包似乎确实解决了可移植性问题,因为根据操作系统调用不同的方法。

    【讨论】:

    • 调用system 是否是安全问题取决于上下文。如果代码在您无法控制的任意机器上运行,那么是的,ping 可以重新定义为其他内容,并且存在安全问题。如果你想从自己的机器上 ping 一堆地址,那不是问题。
    • 它非常慢。花了很多时间,还有其他更快的方法吗?然后我想看看哪些网站没有 ping 通。
    • @Neil 可以在系统级别更改 ping 超时。在 linux 系统中,减少这个时间的选项是ping -i 0.2。您可以使用 URLs &lt;- paste("-i 0.2",URLs) 将此选项传递给 pingr。这应该加快功能。不知道其他操作系统上的选项。
    • 我的意思是说 ping 间隔,而不是超时。
    • @RHertel 如何在 pingr 中使用该选项?
    【解决方案2】:

    我们可以用Vectorize 包装并为多个元素做

    ping1 <- Vectorize(ping)
    ping1(c("yahoo.com", "google.com"))
    ping1("google.com")
    

    【讨论】:

      猜你喜欢
      • 2021-06-20
      • 2012-04-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-06-01
      • 2022-12-08
      • 1970-01-01
      • 2019-06-10
      相关资源
      最近更新 更多