Как определить, есть ли у вас интернет-соединение в R
Иногда мне нужно загружать данные из Интернета. В некоторых случаях это не удавалось из-за того, что веб-сайт не работает или из-за того, что мой компьютер потерял подключение к Интернету.
Вопрос: Есть ли какая-нибудь функция в R, которая вернет TRUE/FALSE в отношении того, подключен ли я к интернету?
Ответы
Ответ 1
Вот попытка анализа вывода из ipconfig/ifconfig, как предложено 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))
}
С простейшим выходом TRUE/FALSE
> havingIP()
[1] TRUE
Ответ 2
Грязная работа будет использовать функцию RCurl::getURL
.
if (is.character(getURL("www.google.com"))) {
out <- TRUE
} else {
out <- FALSE
}
Ответ 3
В пакете curl
есть функция has_internet
, которая тестирует, выполняя nslookup
:
curl::has_internet
## function(){
## !is.null(nslookup("google.com", error = FALSE))
## }
Тестирование DNS выполняется быстрее и может быть более надежным, чем получение URL-адреса, поскольку последний может не работать по несвязанным причинам (например, брандмауэр, отключение сервера и т.д.).
Ответ 4
Просто еще один, чтобы добавить в банк, вдохновленный @romans, это работает только на Windows, я бы предположил, не уверен в других платформах:
canPingSite <- function(test.site) {
!as.logical(system(paste("ping", test.site)))
}
Что мы проверяем следующим образом:
> t1 <- canPingSite("www.yahoo.com")
[...]
> t2 <- canPingSite(";lkjsdflakjdlfhasdfhsad;fs;adjfsdlk")
[...]
> t1; t2
[1] TRUE
[1] FALSE
Ответ 5
Пакет Bioconductor Biobase имеет функцию тестирования подключения к Интернету.
Biobase::testBioCConnection()
Ниже приведена сильно измененная версия этой функции для проверки способности читать строки из 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()
Ответ 6
Сделайте это всего двумя строками кода:
install.packages('pingr')
pingr::is_online()
Ответ 7
Пакет curl
имеет функцию has_internet
, которая проверяет интернет-соединение: TRUE
, если соединение, FALSE
в противном случае.
curl::has_internet()
Ответ 8
Как вышеприведенная функция из 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))
}
также возвращает true для localhost ip "127.0.0.1", его нужно удалить, чтобы предотвратить ложные срабатывания. Например, как показано ниже:
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)]))
}
Но даже лучше было бы решение, которое предотвращает локальные хосты, изменяя регулярное выражение validIP.
Ответ 9
Это вариант ответа айо, который жертвует точностью ради скорости.
IPavailable <- function() {
cmd <- switch(.Platform$OS.type, "windows" = "ipconfig", "ifconfig")
any(grep("(\\d+(\\.|$)){4}", system(cmd, intern = TRUE)))
}