razones - Cómo determinar si tienes conexión a internet en R
programa para proteger mi wifi de intrusos (7)
Aquí hay un intento de analizar la salida de ipconfig / ifconfig, como lo sugiere Spacedman.
havingIP <- function() {
if (.Platform$OS.type == "windows") {
ipmessage <- system("ipconfig", intern = TRUE)
} else {
ipmessage <- system("ifconfig", intern = TRUE)
}
validIP <- "((25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)[.]){3}(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)"
any(grep(validIP, ipmessage))
}
Con una salida simple VERDADERO / FALSO
> havingIP()
[1] TRUE
A veces necesito descargar datos de internet. En ocasiones, esto ha fallado porque el sitio web está inactivo o porque mi computadora ha perdido la conexión a Internet.
Pregunta: ¿Hay alguna función en R que devuelva VERDADERO / FALSO si estoy conectado a Internet?
Como la función de arriba de eyjo.
havingIP <- function() {
if (.Platform$OS.type == "windows") {
ipmessage <- system("ipconfig", intern = TRUE)
} else {
ipmessage <- system("ifconfig", intern = TRUE)
}
validIP <- "((25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)[.]){3}(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)"
any(grep(validIP, ipmessage))
}
también devuelve true para localhost ip "127.0.0.1", debe eliminarse para evitar falsos positivos. Por ejemplo, como se muestra a continuación:
havingIP <- function() {
if (.Platform$OS.type == "windows") {
ipmessage <- system("ipconfig", intern = TRUE)
} else {
ipmessage <- system("ifconfig", intern = TRUE)
}
validIP <- "((25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)[.]){3}(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)"
any(grep(validIP, ipmessage[-grep("127.0.0.1", ipmessage)]))
}
Pero aún mejor sería una solución que evita los hosts locales modificando la expresión regular de validIP.
El paquete curl
tiene una función has_internet
que prueba realizando un nslookup
:
has_internet <- function(){
!is.null(curl::nslookup("r-project.org", error = FALSE))
}
La prueba de DNS es más confiable que recuperar una URL porque la última podría fallar por razones no relacionadas (por ejemplo, firewall, servidor inactivo, etc.).
El paquete Biobase de Bioconductor tiene una función para probar la conexión a Internet.
Biobase::testBioCConnection()
A continuación se muestra una versión muy modificada de esta función para probar la capacidad de leer líneas de una URL.
can_internet <- function(url = "http://www.google.com") {
# test the http capabilities of the current R build
if (!capabilities(what = "http/ftp")) return(FALSE)
# test connection by trying to read first line of url
test <- try(suppressWarnings(readLines(url, n = 1)), silent = TRUE)
# return FALSE if test inherits ''try-error'' class
!inherits(test, "try-error")
}
can_internet()
Hazlo con tres líneas de código:
install.packages(''pingr'')
library(pingr)
pingr::is_online()
Solo otro para agregar al bote, inspirado en la respuesta de @romans, esto funciona solo en Windows, asumo, no estoy seguro acerca de otras plataformas:
canPingSite <- function(test.site) {
!as.logical(system(paste("ping", test.site)))
}
Que probamos de la siguiente manera:
> t1 <- canPingSite("www.yahoo.com")
[...]
> t2 <- canPingSite(";lkjsdflakjdlfhasdfhsad;fs;adjfsdlk")
[...]
> t1; t2
[1] TRUE
[1] FALSE
Un trabajo sucio sería utilizar la función RCurl::getURL
.
if (is.character(getURL("www.google.com"))) {
out <- TRUE
} else {
out <- FALSE
}