为了节省时间,我想迭代一个月开始和月结束日期的向量,每次都发出一个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
非常感谢任何帮助!
答案 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 = ""))
}