1

我一直在使用 Heuristic Andrew博客中的这个很棒的代码

您可以在其中对 IP 地址进行地理定位。我希望能够在大量(24867 个 IP)IP 地址向量上运行该函数。问题是大多数 IP 地址会返回以下错误:

Error in file(con, "r") : cannot open the connection
In addition: Warning message:
In file(con, "r") : cannot open: HTTP status was '404 Not Found'

我假设发生这种情况是因为无法跟踪 IP 地址。

我想创建一个 IP 地址向量的子集,它会给我位置。我想我需要编写另一个函数将 IP 地址放入一个新的工作 IP 地址向量中,或者放入另一个错误 IP 地址向量中。

我想我还需要使用tryortryCatch函数?

我是编程新手,所以我不知道如何编写函数。我看过网上的例子,但不太明白。任何意见,将不胜感激。

编辑: 感谢@Thomas 为我指明了正确的道路......

我使用函数 is.error 来确定是否try()会给我一个错误。返回一个逻辑向量:

is.error <- function(x) inherits(x, "try-error")

尝试使用lapply()

> is.error(
+   try(
+     lapply(X  = ls_IPaddresses, FUN = freegeoip)
+     )
+   )
Error in file(con, "r") : cannot open the connection
[1] TRUE

ls_IPaddresses 的长度是 24867,所以我想要一个长度相同的逻辑向量,这样我就可以根据 ls_IPaddresses 对逻辑向量进行子集化。

4

2 回答 2

6

这应该有效:

ips <- c('184.26.100.110', '555.22.333.111')

try.ip   <- function(ip) suppressWarnings(try(freegeoip(ip), silent = TRUE))
outcomes <- lapply(ips, try.ip)

is.ok    <- function(x) !inherits(x, "try-error")
sapply(outcomes, is.ok)
# [1] TRUE  FALSE
于 2013-07-08T23:23:39.143 回答
0

尝试这个:

options(warn=-1)
aaa<-c('123.45.67.89', '999.45.67.89')
bbb<-sapply(aaa, function(x) {a<-freegeoip(x); print(a) })

似乎对我有用。

于 2013-07-08T21:42:47.877 回答