首页 文章

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

提问于
浏览
0

为了节省时间,我想迭代一个月开始和月结束日期的向量,并每次发出一个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 回答

  • 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)
    
  • 0

    偶然的事情,你的for循环实际上并没有做任何事情 . 你说 for i in ... 但你再也没有引用 i . 并且,如果您发布一些示例数据,以便我们可以尝试重新创建您正在执行的操作,那么就会有帮助 .

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

    我'm assuming your R objects that you pass to GET (other than startDate and endDate) don'改变?如果是这种情况,并且您想要使用循环,则可以预先分配与您希望返回的数据长度相同的向量,然后遍历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 = ""))
    }
    

相关问题