loop-R中的复杂tryCatch

时间:2016-04-15 07:47:20

标签: r loops try-catch

我正在编写代码以从Uncomtrade-一个UN的数据库中获取数据。因为数据库的使用限制为每小时100个查询,所以我需要花一些时间。 我想用tryCatch编写代码:

  1. 每次出现最大限制错误时,自动将程序设置为超时
  2. 如果连接错误发生,则重新运行i,j和k的当前级别
  3. 我当前的代码仍然有效但我想学习如何使用tryCatch 还有一种方法可以摆脱for循环。可以在这里使用apply系列功能吗?                                        谢谢你们

     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)
             }
              }
            }
              }
    

1 个答案:

答案 0 :(得分:0)

我无法真正帮助您使用TryCatch();我自己没有经验。

关于for循环,这是一个解决方案(虽然我认为在这些情况下for循环并不是那么邪恶;矢量化确实在所有类型的矩阵运算等中都有用)。

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)
  })

从您自己的代码中,s1(也)似乎是一个data.frame,因此在这种情况下,dplyr do()很好地将所有这些数据框粘合在一起。

HTH