【问题标题】:R: iterate through list of start and end dates and insert into an API requestR:遍历开始和结束日期列表并插入到 API 请求中
【发布时间】:2017-09-13 04:19:48
【问题描述】:

为了节省时间,我想遍历包含月开始日期和月结束日期的向量,每次都发出 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 粘贴到以下 rest 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

任何帮助将不胜感激!

【问题讨论】:

    标签: json r api loops


    【解决方案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)
    

    【讨论】:

    • 感谢您指出我遇到的问题!你的解决方案奏效了,我会花时间在申请家庭上
    【解决方案2】:

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

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

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

    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 = ""))
    }
    

    【讨论】:

    • 使用 R 的 apply 系列创建对象列表,无需初始化。
    • 我也会这样做,但 Apply 可能会让新的 R 用户望而却步。 (我想我假设海报是新的。)
    猜你喜欢
    • 2021-01-14
    • 2023-03-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-07
    • 1970-01-01
    • 2021-10-03
    • 2018-11-03
    相关资源
    最近更新 更多