2016-04-15 1 views
0

J'écris le code pour obtenir les données de Uncomtrade - une base de données des Nations Unies. Parce que la base de données a une limite d'utilisation de 100 demandes/heure, je dois donc y mettre un peu de temps. Je veux écrire le code avec TryCatch qui:Complex tryCatch in loop-R

  1. programmes automatiquement réglée à l'heure à chaque fois que l'erreur de limite max apparaît
  2. Relancez le niveau actuel de i, j et k si un orcurs d'erreur de connexion

Mon code actuel fonctionne toujours bien, mais je veux apprendre à utiliser TryCatch trop Et est-il un moyen de se débarrasser des boucles pour. La fonction famille d'application peut-elle être utilisée ici? Merci les gars

n=0 
    a<-c() 
for (i in (1996:2014)) { 
    for (j in c("0301","0302","0303","0304","0305","0306","0307","0308")) { 
      for (k in c("704","116","360","418","458","104","608","702","764")) { 
      s2<-paste(i,j,k,sep="") 
      a<-c(a,s2) 
      print (s2) 
      n<-n+1 
      if(n<=100) { 
      s1 <- get.Comtrade(r=k, ps=i, rg="2", cc=j, fmt="csv",px="H0") 
     Sys.sleep (1) 
      s1<-do.call(rbind.data.frame,s1) 
      library(foreign) 
      write.dta(s1,file=paste("D:/unTrade/",s2,".dta")) 
      } 
     else { 
      print(n) 
      print(s2) 
      print("reset here") 
      n=0 
      Sys.sleep(3610) 
     } 
      } 
     } 
      } 

Répondre

0

Je ne peux pas vraiment vous aider avec le TryCatch(); Je n'ai pas l'expérience moi-même.

En ce qui concerne les boucles for, ceci est une solution (bien que je pense que dans ces cas les for-loops ne sont pas si maléfiques, la vectorisation compte vraiment dans toutes sortes d'opérations matricielles etc.).

dat <- expand.grid(i = 1996:1999, j = c("0301","0302","0303","0304","0305","0306","0307","0308"), k = c("704","116","360","418","458","104","608","702","764")) 
library(dplyr) 
dat %>% group_by(i, j, k) %>% 
    do({ 
     cat('s1 <- get.Comtrade(r=', .$k, ', ps=', .$i, ', cc=', .$j, ', rg=\"2\", fmt=\"csv\",px=\"H0\")\n') 
     flush.console() 
     # return(s1) 
    }) 

À partir de votre propre code s1 (aussi) semble être un data.frame, dans ce cas, la dplyr do() colles bien toutes ces données cadres ensemble.

HTH

+0

merci. enregistré vos réponses pour un usage ultérieur :) – Mathnoob