我正在编写代码以从Uncomtrade-一个UN的数据库中获取数据。因为数据库的使用限制为每小时100个查询,所以我需要花一些时间。 我想用tryCatch编写代码:
我当前的代码仍然有效但我想学习如何使用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)
}
}
}
}
答案 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