2017-09-13 7 views
0

시간을 절약하려면 매월 시작일과 종료일의 벡터를 반복하고 각 시간에 API 요청을 만들고 각각의 출력을 저장하고 싶습니다. 의뢰.R : 시작일과 종료일 목록을 반복하여 API 요청에 삽입하십시오.

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가 각 행을 반복하여 붙여 넣기 싶습니다 :

우리가 기간의 월의 첫 번째와 마지막 날을 잡고 dateTable라는 dataframe로 시작하는 말 이 코드 조각을 실행할 때 나머지 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 

어떤 도움도 대단히 감사하겠습니다!

답변

1

현재 각 반복하여 for 루프에서 전체 벡터를 전달하고 루프 변수에 의해 인덱싱되지 않은, i :

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

그럼에도 불구하고, 반복 Map (또는 동등한 mapply(..., SIMPLIFY=FALSE))을 고려 두 컬럼을 통해 elementwise. 이 접근 방식을 사용하면 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

내가 가지고 있었던 문제를 지적 해 주셔서 감사합니다! 당신의 솔루션이 효과가 있었고, 나는 가족에게 시간을 할애 할 것입니다. –

0

몇 가지, 당신의 for 루프는 실제로 아무 것도하지 않습니다. 당신은 for i in ...라고하지만 결코 다시 i을 참조하지 마십시오. 그리고 startDate와 endDate를 루프에 넣을 이유가 없습니다. 또한, 샘플 데이터를 게시하여 현재 수행중인 작업을 다시 만들려고 할 때 도움이됩니다.

어쨌든, 오류는 무엇이 잘못되었는지를 알려주고 있습니다. URL 벡터를 GET에 전달할 수 없습니다. 전달한 모든 것을 GET()으로 가져 와서 콘솔에 붙여 넣기 만하면됩니다. n 개의 URL을 되 찾을 것이며, n은 dateTable의 행 수입니다.

GET (startDate 및 endDate 제외)에 전달한 R 개체가 변경되지 않는다고 가정합니다. 이 경우 루프를 사용하려면 반환 할 데이터와 동일한 길이의 벡터를 미리 할당 한 다음 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 = "")) 
} 
+1

초기화 할 필요없이 오브젝트 목록을 작성하려면 R 's * apply * 제품군을 사용하십시오. – Parfait

+0

그게 내가 할 수있는 일이지만, Apply는 새로운 R 사용자에게 협박 할 수 있습니다. (나는 포스터가 새로운 것 같다고 생각한다.) – CCD

관련 문제