Подтвердить что ты не робот

Как определить, есть ли у вас интернет-соединение в R

Иногда мне нужно загружать данные из Интернета. В некоторых случаях это не удавалось из-за того, что веб-сайт не работает или из-за того, что мой компьютер потерял подключение к Интернету.

Вопрос: Есть ли какая-нибудь функция в R, которая вернет TRUE/FALSE в отношении того, подключен ли я к интернету?

4b9b3361

Ответ 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)))
}