2016-08-21 47 views
1

我有一个数据框具有域名列。我想通过ping他们的域名来查看哪个域名存在。我可以从后续功能获得单独的ping响应。如何获得在R的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响应。

回答

5

这是不使用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可以重新定义做一些完全不同的,可能有害的东西。包似乎解决的问题是可移植性问题,因为根据OS调用不同的方法。

+0

是否调用'system'是一个安全问题取决于上下文。如果代码在任何你无法控制的机器上运行,那么是的,'ping'可以被重新定义为别的东西,并且存在安全问题。如果你想从你自己的机器上ping一堆地址,那不是问题。 –

+0

它非常缓慢。花很多时间,有没有其他方法更快?然后我想查看哪些网站不能ping通。 – Neil

+0

@Neil可以在系统级别更改ping超时。在Linux系统中,减少这个时间的选项是'ping -i 0.2'。你可以通过使用URLs < - paste(“ - i 0.2”,URLs)''将这个选项传递给pingr。这应该加快功能。不知道其他操作系统的选项。 – RHertel

2

我们可以Vectorize包裹和多个元素

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