2015-12-11 6 views
0

Я пытаюсь сделать вызов API в строке моего data.frame, передавая значение строки в качестве параметра. Возвращаемое значение должно быть добавлено в мой кадрвызов REST API для каждой строки data.frame в R

Однако я не могу заставить работать мой код. Любая помощь приветствуется.

Содержание APPLYapiCallTest.csv:

id title returnValue 
01 "wine" "" 
02 "beer" "" 
03 "coffee" "" 

По сути называющие API с call("wine) и заменить пустое поле с результатом, например, напитки.

Вот что я получил до сих пор.

#call api per row using apply 
library(jsonlite) 
library(httr) 


callAPI <- function(x) { 

    findWhat <- as.character(x) 

    #create ULR 
    url1 <- "http://api.nal.usda.gov/ndb/search/?format=json&q=" 
    url2 <- "&sort=n&max=1&offset=0&api_key=KYG9lsu0nz31SG5yHGdAsM28IuCEGxWWlvdYqelI&location=Chicago%2BIL" 
    fURL <- paste(url1, findWhat, url2, sep="") 

    apiRet <- data.frame(fromJSON(txt=fURL, flatten = TRUE)) 

    result <- apiRet[1,c(9)] 
    return(result) 
} 


tData <- data.frame(read.delim("~/Documents/R-SCRIPTS/DATA/APPLYapiCallTest")) 

apply(tData[,c('title')], 1, function(x) callAPI(x)) 

ответ

2

Я думаю, вы бы лучше делать что-то вроде этого:

library(jsonlite) 
library(httr) 
library(pbapply) 

callAPI <- function(x) { 

    res <- GET("http://api.nal.usda.gov/ndb/search/", 
      query=list(format="json", 
         q=x, 
         sort="n", 
         offset=0, 
         max=16, 
         api_key=Sys.getenv("NAL_API_KEY"), 
         location="Berwick+ME")) 

    stop_for_status(res) 

    return(data.frame(fromJSON(content(res, as="text"), flatten=TRUE), stringsAsFactors=FALSE)) 

} 


tData <- data.frame(id=c("01", "02", "03"), 
        title=c("wine", "beer", "coffee"), 
        returnValue=c("", "", ""), 
        stringsAsFactors=FALSE) 


dat <- merge(do.call(rbind.data.frame, pblapply(tData$title, callAPI)), 
      tData[, c("title", "id")], by.x="list.q", by.y="title", all.x=TRUE) 

str(dat) 

## 'data.frame': 45 obs. of 12 variables: 
## $ list.q   : chr "beer" "beer" "beer" "beer" ... 
## $ list.sr   : chr "28" "28" "28" "28" ... 
## $ list.start  : int 0 0 0 0 0 0 0 0 0 0 ... 
## $ list.end  : int 13 13 13 13 13 13 13 13 13 13 ... 
## $ list.total  : int 13 13 13 13 13 13 13 13 13 13 ... 
## $ list.group  : chr "" "" "" "" ... 
## $ list.sort  : chr "n" "n" "n" "n" ... 
## $ list.item.offset: int 0 1 2 3 4 5 6 7 8 9 ... 
## $ list.item.group : chr "Beverages" "Beverages" "Beverages" "Beverages" ... 
## $ list.item.name : chr "Alcoholic beverage, beer, light" "Alcoholic beverage, beer, light, BUD LIGHT" "Alcoholic beverage, beer, light, BUDWEISER SELECT" "Alcoholic beverage, beer, light, higher alcohol" ... 
## $ list.item.ndbno : chr "14006" "14007" "14005" "14248" ... 
## $ id    : chr "02" "02" "02" "02" ... 

Таким образом, вы делаете структурированную вызов через httr::GET для каждого title в tData, а затем связывание всех результатов вместе в кадр данных и, наконец, добавить обратно идентификатор.

Это также позволяет поставить NAL_API_KEY в .Renviron и не подвергать его в своих рабочих процессах (и на SO :-)

Вы можете отсечь результирующее API ответы вам не нужны либо в функции или вне Это.

+0

очень круто. Спасибо! – DirkLX

Смежные вопросы