Как определить, есть ли у вас подключение к интернету в R - PullRequest
32 голосов
/ 22 февраля 2011

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

Вопрос: Есть ли в R какая-либо функция, которая будет возвращать значение ИСТИНА / ЛОЖЬ относительно того, подключен ли я к Интернету?

Ответы [ 8 ]

25 голосов
/ 22 февраля 2011

Грязный обходной путь будет использовать функцию RCurl::getURL.

if (is.character(getURL("www.google.com"))) {
    out <- TRUE
} else {
    out <- FALSE
}
17 голосов
/ 24 января 2016

В пакете curl есть функция has_internet, которая тестирует, выполняя nslookup:

has_internet <- function(){
  !is.null(curl::nslookup("r-project.org", error = FALSE))
}

Тестирование DNS более надежно, чем получение URL-адреса, поскольку последний может не работать по несвязанным причинам (например, брандмауэр, отключение сервера и т. д.).

16 голосов
/ 22 февраля 2011

Вот попытка парсинга вывода из 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
9 голосов
/ 22 февраля 2011

Просто еще один способ добавить в банк, вдохновленный ответом @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
4 голосов
/ 12 июля 2013

Пакет Biobonductor 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()
3 голосов
/ 27 июля 2017

Сделайте это с тремя строками кода:

install.packages('pingr')
library(pingr)
pingr::is_online()
2 голосов
/ 09 июня 2013

Поскольку вышеприведенная функция от 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 для ip 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.

0 голосов
/ 26 марта 2019

Пакет curl имеет функцию has_internet, которая проверяет интернет-соединение: TRUE если соединение, FALSE в противном случае.

curl::has_internet()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...