R:遍历开始和结束日期列表并插入API请求

时间:2017-09-13 04:19:49

标签: json r api loops

为了节省时间,我想迭代一个月开始和月结束日期的向量,每次都发出一个API请求并存储每个请求的输出。

假设我们从名为dateTable的数据框开始,该数据框保存日期范围的月份的第一天和最后一天:

firstDOM    lastDOM
2016-05-01  2016-05-31
2016-06-01  2016-06-30
2016-07-01  2016-07-31
2016-08-01  2016-08-31
2016-09-01  2016-09-30
2016-10-01  2016-10-31
2016-11-01  2016-11-30
2016-12-01  2016-12-31
2017-01-01  2017-01-31
2017-02-01  2017-02-28
2017-03-01  2017-03-31
2017-04-01  2017-04-30
2017-05-01  2017-05-31
2017-06-01  2017-06-30
2017-07-01  2017-07-31
2017-08-01  2017-08-31

我想遍历每一行并将startDate和endDate粘贴到以下的其余API请求中,但是在运行这段代码时我一直收到以下错误,我不确定是什么导致它:

for (i in 1:nrow(dateTable)) {
startDate <- dateTable$firstDOM
endDate <- dateTable$lastDOM

#Obtian the Volume of Mentions by Day using declared specs from above
qryMen <- GET(paste("https://newapi.brandwatch.com/projects/", projId, dataSpec
                , "?queryId=", queryId, "&startDate=", startDate, "&endDate=", endDate
                , '&pageSize=', pageSize, "&access_token=", accessToken$access_token, sep = ""))
}

#Error
Error: length(url) == 1 is not TRUE

非常感谢任何帮助!

2 个答案:

答案 0 :(得分:1)

目前,您在每次迭代时都在for循环中传递整个向量,而不是通过循环变量i进行索引:

for (i in 1:nrow(dateTable)) {
   startDate <- dateTable$firstDOM[[i]]
   endDate <- dateTable$lastDOM[[i]]
   ...
}

尽管如此,请考虑Map(或等效的mapply(..., SIMPLIFY=FALSE))在元素中迭代两列。使用这种方法,您可以保存大量对象(无论您的查询返回什么),其中元素的数量等于 dataTable 的行。然后,您可以使用此列表进行进一步操作。

api_fct <- function(startDate, endDate) {

  qryMen <- GET(paste0("https://newapi.brandwatch.com/projects/", projId, dataSpec
                , "?queryId=", queryId, "&startDate=", startDate, "&endDate=", endDate
                , '&pageSize=', pageSize, "&access_token=", accessToken$access_token))

}

api_list <- Map(api_fct, dateTable$firstDOM, dateTable$lastDOM)

# api_list <- mapply(api_fct, dateTable$firstDOM, dateTable$lastDOM, SIMPLIFY=FALSE)

答案 1 :(得分:0)

偶然的事情,你的for循环实际上并没有做任何事情。您说for i in ...,但您再也没有引用i。并且,没有理由将startDate和endDate放在循环中。此外,如果您发布一些示例数据,我们可以尝试重新创建您正在执行的操作,这会有所帮助。

无论如何,这个错误告诉你出了什么问题:你无法将一个URL向量传递给GET。将传递给GET()的所有内容都粘贴到控制台中。您将获得n个URL,n是dateTable中的行数。

我假设您传递给GET的R对象(除了startDate和endDate)不会改变?如果是这种情况,并且您想要使用循环,则可以预先分配与您希望返回的数据长度相同的向量,然后遍历startDate和endDate,将它们传递给GET()并插入将它们放入qryMen对象。

startDate <- dateTable$firstDOM
endDate <- dateTable$lastDOM
qryMen <- vector(mode = "list", length = nrow(dataTable)
for (i in 1:nrow(dateTable)) {
  qryMen[i] <- GET(paste("https://newapi.brandwatch.com/projects/", projId,
                dataSpec, "?queryId=", queryId, 
                "&startDate=", startDate[i], 
                "&endDate=", endDate[i],
                "&pageSize=", pageSize,
                "&access_token=", accessToken$access_token, sep = ""))
}