GOOGLE ADS

Freitag, 22. April 2022

Aufrufwiederholungen mit httr::RETRY()-Funktion im API-Aufruf implementieren (R)

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::RETRYkö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.ComtradeFunktion 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

Warum werden SCHED_FIFO-Threads derselben physischen CPU zugewiesen, obwohl CPUs im Leerlauf verfügbar sind?

Lösung des Problems Wenn ich das richtig verstehe, versuchen Sie, SCHED_FIFO mit aktiviertem Hyperthreading ("HT") zu verwenden, ...