Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/83.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R:循环遍历列表并将值传递给UN Comtrade的API+;在循环中编程暂停_R_Api_Loops - Fatal编程技术网

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

R:循环遍历列表并将值传递给UN Comtrade的API+;在循环中编程暂停,r,api,loops,R,Api,Loops,我想将列表的参数传递给调用UN Comtrade数据API的函数。此外,我需要在API的每个查询之后添加暂停,以不超过UN Comtrade的限制 在没有循环的情况下,我通过以下方式调用API: q276a只需使用lappy即可,在对象引用中传递i,而不是带引号的文本(如果ls\u reporters保存数值数据,则在中将i包装为.character())。另外,使用Sys.sleep(time)在迭代之间暂停脚本的执行,time以秒为单位 请注意,与循环的不同,返回的输出是一个大的数据元素列表

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

在没有循环的情况下,我通过以下方式调用API:


q276a只需使用
lappy
即可,在对象引用中传递
i
,而不是带引号的文本(如果
ls\u reporters
保存数值数据,则在
中将
i
包装为.character()
)。另外,使用
Sys.sleep(time)
在迭代之间暂停脚本的执行,
time
以秒为单位

请注意,与
循环的
不同,返回的输出是一个大的数据元素列表,其数量等于
ls\u reporters
中的元素数量。如果每个国家/地区的数据都需要单独的对象,请使用
list2env()
(但如果不需要,则无需向环境中注入100个对象):

#COMTRADE数据列表(长度等于输入列表)

comtrade_数据查看
paste0
parse(text=paste0(…)
。但是我认为使用
parse
的方法不是很快。谢谢,非常有效!你的代码帮助我更好地理解lapply!还有一个问题:我假设只有当列表中的所有元素都具有相同的维度时,才能将行绑定到一个数据帧(这就是“一级数据结构”的意思吗)?就整个comtrade_数据而言,它对我不起作用。该命令仅生成具有2列的数据帧。然而,对于每个单独的对象,我都会得到一个很好的数据帧,例如,
df_q156a很棒!因为我看不到comtrade的输出,所以我说不出来。但是是的,为了使用
do.call(rbind,list)
,元素需要具有相同的结构和名称。如果至少有一个不同,调用将不起作用。当然,您甚至可以
lappy()
生成单独的帧!我对R和apply仍然很差,以至于我无法从列表中获得单个帧。我尝试了一些东西。我的最终目标是将列表中的所有元素放到一个大数据框中,这样我就可以运行分析或导出到dta并在STATA中使用。明白了。当然,您可以使用R进行分析。但使用
insheet
命令将此类数据帧导出为csv并导入Stata。在R之前,我只知道并使用Stata(现在我不能回去了)!干杯
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"))
}
# LIST OF COMTRADE DATA (LENGTH EQUAL TO INPUT LIST)
comtrade_data <- lapply(ls_reporters, function(i) {
                            Sys.sleep(1)
                            tmp <- get.Comtrade(r=i, p="0", freq="M", ps="all", 
                                                cc="842520", rg="2", fmt="csv")
                            df <- as.data.frame(do.call(rbind, tmp))
                            return(df)
                 })

# NAME EACH ELEMNT OF NEW LIST BY PREFIXING "q"
comtrade_data <- setNames(comtrade_data, paste0("df_q", ls_reporters))

# CREATE df_q1, df_q2, df_q3, ... AS INDIVIDUAL OBJECTS
list2env(comtrade_data, envir=.GlobalEnv)

# EVEN ROW BIND TO DATAFRAME (IF ELEMENTS HAVE SAME EXACT ONE-LEVEL DATA STRUCTURE)
df <- do.call(rbind, comtrade_data)