Как написать несколько CSV-файлов на основе ответов от API, которые зависят от даты - PullRequest
0 голосов
/ 26 марта 2019

Я пытаюсь создать CSV-файлы, которые соответствуют ответу, полученному от API на данную дату.

Вместо того, чтобы редактировать мой код каждый раз, когда я хочу новую дату, кажется логичным создать цикл. Я создал вектор с именем «date» и попытался запустить следующий код.

library(httr)
library(jsonlite)
date=c("201801","201802","201803","201804","201805")

for(i in 1:5){
url="https://website.com/api/data"
body=list(fields=list("symbol", "letter", "number"),
          history=date[i])
response=POST(url, body=body, encode="json")
data=content(response)$data       #data is a portion of the response#
write.csv(data[[i]], paste(i, ".csv"))
}

Обратите внимание, что если я исключу цикл for и просто использую элемент из вектора даты, я получу вывод, требуемый для одной даты

url="https://website.com/api/data"
body=list(fields=list("symbol", "letter", "number"),
          history=date[2])
response=POST(url, body=body, encode="json")
data=content(response)$data       #data is a portion of the response#
write.csv(data, '2.csv')

Использование цикла for создает пустой ответ. Есть идеи, где я ошибаюсь?

Ответы [ 2 ]

0 голосов
/ 26 марта 2019

Как уже упоминалось, с итерациями, такими как for или lapply, выполняющими потенциально открытые процессы, рассмотрите возможность ожидания цикла для завершения процесса с использованием Sys.sleep(##). Кроме того, используйте seq_along, чтобы избежать жесткого кодирования вектора даты :

dates = c("201801","201802","201803","201804","201805")

for(i in seq_along(dates)){
   url = "https://website.com/api/data"
   body = list(fields = list("symbol", "letter", "number"),
               history = dates[i])
   response = POST(url, body = body, encode = "json")
   data = content(response)$data       # data is a portion of the response

   Sys.sleep(5)     # ADJUST SECONDS AS NEEDED                          
   write.csv(data, paste0(dates[i], ".csv"))
}

В качестве альтернативы, используйте lapply и даже возвращайте данные после записи каждого CSV в список для последующего использования:

data_list <- lapply(seq_along(dates), function(i)  {    
     url = "https://website.com/api/data"
     body = list(fields = list("symbol", "letter", "number"),
                 history = dates[i])
     response = POST(url, body = body, encode = "json")
     data = content(response)$data       # data is a portion of the response

     Sys.sleep(5)     # ADJUST SECONDS AS NEEDED                          
     write.csv(data, paste0(dates[i], ".csv"))

     return(data)
})
0 голосов
/ 26 марта 2019

Вы можете сделать это немного более читабельным, например, так:

library(httr)
library(jsonlite)
library(tidyverse)

date <- c("201801","201802","201803","201804","201805")
url <- "https://website.com/api/data"

# Define function
write_files <- function(date, i) {
  body <- list(fields = list("symbol", "letter", "number"),
               history = date)
  response <- POST(url, body = body, encode = "json")
  data <- content(response)$data
  write.csv(data, file = i)
}

# Apply function to each element of date
imap(date, write_files)

(ваш пример не был воспроизведен, поэтому он не проверен)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...