Ich verwende die UN Comtrade-Daten-API mit R.
get.Comtrade <- function(url="http://comtrade.un.org/api/get?"
,maxrec=50000
,type="C"
,freq="A"
,px="HS"
,ps="now"
,r
,p
,rg="all"
,cc="TOTAL"
,fmt="json"
)
{
string<- paste(url
,"max=",maxrec,"&" #maximum no. of records returned
,"type=",type,"&" #type of trade (c=commodities)
,"freq=",freq,"&" #frequency
,"px=",px,"&" #classification
,"ps=",ps,"&" #time period
,"r=",r,"&" #reporting area
,"p=",p,"&" #partner country
,"rg=",rg,"&" #trade flow
,"cc=",cc,"&" #classification code
,"fmt=",fmt #Format
,sep = ""
)
if(fmt == "csv") {
raw.data<- read.csv(string,header=TRUE)
return(list(validation=NULL, data=raw.data))
} else {
if(fmt == "json" ) {
raw.data<- fromJSON(file=string)
data<- raw.data$dataset
validation<- unlist(raw.data$validation, recursive=TRUE)
ndata<- NULL
if(length(data)> 0) {
var.names<- names(data[[1]])
data<- as.data.frame(t( sapply(data,rbind)))
ndata<- NULL
for(i in 1:ncol(data)){
data[sapply(data[,i],is.null),i]<- NA
ndata<- cbind(ndata, unlist(data[,i]))
}
ndata<- as.data.frame(ndata)
colnames(ndata)<- var.names
}
return(list(validation=validation,data =ndata))
}
}
}
Manchmal kann jedoch keine Verbindung zum Server hergestellt werden, und ich muss den Code mehrmals ausführen, damit er funktioniert. Die hier gegebene Lösung, die Retry()
Funktion zu verwenden, die eine Anfrage wiederholt, bis sie erfolgreich ist, scheint attraktiv. Ich habe jedoch einige Schwierigkeiten, diese Funktion in den oben angegebenen Code zu implementieren. hat es schon mal jemand benutzt und weiß wie man es umkodiert?
Lösung des Problems
Ein API-Aufruf mit httr::RETRY
könnte wie folgt aussehen:
library(httr)
library(jsonlite)
res <- RETRY(
verb = "GET",
url = "http://comtrade.un.org/",
path = "api/get",
encode = "json",
times = 3,
query = list(
max = 50000,
type = "C",
freq = "A",
px = "HS",
ps = "now",
r = 842,
p = "124,484",
rg = "all",
cc = "TOTAL",
fmt = "json"
)
)
json_content <- content(res, as = "text")
parsed_content <- fromJSON(json_content)
parsed_content$validation
parsed_content$dataset
Ich würde vorschlagen, die get.Comtrade
Funktion neu zu schreiben mit httr
:
get.Comtrade <- function(verb = "GET",
url = "http://comtrade.un.org/",
path = "api/get",
encode = "json",
times = 3,
max = 50000,
type = "C",
freq = "A",
px = "HS",
ps = "now",
r,
p,
rg = "all",
cc = "TOTAL",
fmt = "json") {
res <- httr::RETRY(
verb = verb,
url = url,
path = path,
encode = encode,
times = times,
query = list(
max = max,
type = type,
freq = freq,
px = px,
ps = ps,
r = r,
p = p,
rg = rg,
cc = cc,
fmt = fmt
)
)
jsonlite::fromJSON(content(res, as = "text"))
}
s1 <- get.Comtrade(r = "842", p = "124,484", times = 5)
Bitte lesen Sie dies und das für weitere Informationen über library(httr)
.
Keine Kommentare:
Kommentar veröffentlichen