【发布时间】:2013-11-26 15:06:49
【问题描述】:
我一直在使用来自 Heuristic Andrew 博客和 StackOverflow Question 的这个很棒的代码。
我想做一个简单的修改,使我的最终输出也包含来自原始数据帧的 ID 信息。这是我现在拥有的代码
test1 <- structure(list(ID = c("A123", "A123", "A125", "A126"),
IP = c("173.74.6.149", "109.189.227.94",
"50.27.115.146", "1.64.170.178")),
.Names = c("ID", "IP"), class = "data.frame",
row.names = c(NA, 4L))
freegeoip <- function(ip, format = ifelse(length(ip)==1,'list','dataframe'))
{
if (1 == length(ip))
{
# a single IP address
require(rjson)
url <- paste(c("http://freegeoip.net/json/", ip), collapse='')
ret <- fromJSON(readLines(url, warn=FALSE))
if (format == 'dataframe')
ret <- data.frame(t(unlist(ret)))
return(ret)
} else {
ret <- data.frame()
for (i in 1:length(ip))
{
r <- freegeoip(ip[i], format="dataframe")
ret <- rbind(ret, r)
}
return(ret)
}
}
try.ip <- function(ip) suppressWarnings(try(freegeoip(ip), silent = TRUE))
outcomes <- lapply(test1$IP, try.ip)
is.ok <- function(x) !inherits(x, "try-error")
outcomes <- outcomes[sapply(outcomes, is.ok)]
outcomes <- do.call("rbind", outcomes)
我认为正确的做法是修改freegeoip 函数,但我不确定如何。
谁能帮帮我?
【问题讨论】:
标签: r