применить внутри применить функцию? - PullRequest
0 голосов
/ 27 февраля 2020

У меня есть фрейм данных с началом и концом каждого месяца 2019 года.

Мне нужно сделать выборку в API, написать CSV-файл с именем mydf плюс месяц ( например, mydf-01.csv, mydf-02.csv и др. c).

Мне нужно получить данные, записать CSV, очистить память, чтобы избежать сообщения об ошибке «недостаточно памяти», и продолжить в следующем месяце.

Пока у меня есть это, но есть из-за ошибки: недостаточно памяти, потому что ожидаемые данные за весь 2019 год составляют около 3 ГБ. Но, может быть, я могу использовать другую функцию семейства применений?

Месяцы: my_dates data.frame

Вот как это выглядит:

from        to
2019-01-01  2019-01-31
2019-02-01  2019-02-28
2019-03-01  2019-03-31
...

Код для генерации 12 месяцев:

som <- function(x) as.Date(cut(as.Date(x), "month")) # start of month
eom <- function(x) som(som(x) + 32) - 1 # end of month

month_ranges <- function(from, to) {
  s <- seq(som(from), as.Date(to), "month")
  data.frame(from = pmax(as.Date(from), s), to = pmin(as.Date(to), eom(s)))
}

my_dates <- month_ranges(som("2019-01-01"), eom("2019-12-31"))

Код для извлечения данных:

В настоящее время он выбирает все месяцы хранит их в памяти и в конце соединяет их вместе. Однако такой подход дает ошибку, когда месячный диапазон слишком велик, поскольку данные превышают 2 ГБ. Поэтому я бы хотел, чтобы каждый месяц сохранялись данные в> CSV и продолжался следующий месяц.

library(googleAuthR)
library(googleAnalyticsR)

my_fetch <- function(ga_id, d1, d2) {
  google_analytics(ga_id,
                   date_range = c(d1, d2),
                   metrics = c("totalEvents"),
                   dimensions = c("ga:date", "ga:eventCategory", "ga:eventAction", "ga:eventLabel"),
                   anti_sample = TRUE,
                   anti_sample_batches = 1,
                   rows_per_call = 400)
}


my_fetches_fetches <- mapply(my_fetch, myviewID, my_dates$from, my_dates$to, SIMPLIFY = FALSE)


total <- do.call(rbind, my_fetches_fetches)

ОБНОВЛЕНИЕ 1:

Может быть, можно было бы передать "l oop", которая генерирует ошибку, например, тайм-аут API для продолжения до следующего месяца?

...