2016-08-21 52 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")