我想将列表的参数传递给调用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的文档答案 0 :(得分:0)
只需使用[[page.title]]
作为对象引用传递lapply
,而不是带引号的文字(如果i
包含数字数据,请ls_reporters
包裹i
})。此外,使用as.character()
暂停迭代之间的脚本执行,Sys.sleep(time)
以秒为单位。
请注意,与time
循环不同,返回的输出是一个大的数据元素列表,等于for
中的元素数。如果您需要为每个国家/地区数据创建单独的对象,请使用ls_reporters
(但如果不需要,则不需要使用可能包含100个对象的环境):
list2env()