R:循环遍历列表并将值传递给UN Comtrade的API。 +在循环中编程暂停

时间:2016-08-27 15:11:45

标签: r api loops

我想将列表的参数传递给调用UN Comtrade Data的API的函数。此外,我需要在每次查询后向API添加暂停,以不超过UN Comtrade的限制。

没有循环,我就这样调用API:

q276a <- get.Comtrade(r="276", p="0", freq="M", ps="all", cc="842520", rg="2", fmt="csv") df_q276a<-as.data.frame(do.call(rbind, q1a)

r="276"指定我想要来自报告国家/地区的数据,其代码为“276”,即德国。要从所有报告国家/地区获取数据,我希望循环显示包含所有国家/地区代码的列表。 (我不能只指定“全部”,因为API仅限制其中一个参数r,p,ps的值“all”

到目前为止我写的是:

for (i in ls_reporters){
  assign(paste("q", i,"a", sep = ""), get.Comtrade(r="i", p="0", freq="M", ps="all", cc="842520", rg="2", fmt="csv"))
}

这会产生错误

  

文件错误(文件,“rt”):无法打开连接

我的代码似乎将r="i"传递给API,而不是循环遍历ls_reporters中的值并将这些值传递给API,例如4然后18等等。但是,如果我输入i,我得到“4”,这是ls_reporters的第一个值。

作为补充问题:如何在每次迭代后编程暂停几秒钟,以不超过UN Comtrade每秒1次请求的限制?

如果有更优雅的方式编程这个没有循环我会很高兴学习它。我是R的新手。

可以找到通过公共API查询数据的R代码here。 可以在here

找到API的文档

1 个答案:

答案 0 :(得分:0)

只需使用[[page.title]]作为对象引用传递lapply,而不是带引号的文字(如果i包含数字数据,请ls_reporters包裹i })。此外,使用as.character()暂停迭代之间的脚本执行,Sys.sleep(time)以秒为单位。

请注意,与time循环不同,返回的输出是一个大的数据元素列表,等于for中的元素数。如果您需要为每个国家/地区数据创建单独的对象,请使用ls_reporters(但如果不需要,则不需要使用可能包含100个对象的环境):

list2env()