【问题标题】:Complex tryCatch in loop-R循环-R中的复杂tryCatch
【发布时间】:2016-04-15 07:47:20
【问题描述】:

我正在编写代码以从联合国数据库 Uncomtrade 获取数据。因为数据库的使用限制为 100 次查询/小时,所以我需要花点时间。 我想用 tryCatch 编写代码:

  1. 每次出现最大限制错误时自动设置程序超时
  2. 如果出现连接错误,则重新运行 i、j 和 k 的当前级别

虽然我当前的代码仍然有效,但我也想学习如何使用 tryCatch 还有一种方法可以摆脱 for 循环。这里可以使用apply family功能吗? 谢谢大家

 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 loops try-catch


    【解决方案1】:

    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

    【讨论】:

      猜你喜欢
      • 2015-06-01
      • 1970-01-01
      • 1970-01-01
      • 2018-10-02
      • 2013-02-11
      • 2020-03-23
      • 2015-12-28
      • 1970-01-01
      相关资源
      最近更新 更多