Добавить строки в фрейм данных с помощью purrr - PullRequest
0 голосов
/ 09 июня 2018

У меня есть задача, которая требует много вызовов API в неделю.Я хотел бы добавить все эти данные вместе с кратким кодом через purrr, но мне трудно заставить Sys.sleep работать в моей функции.

Ниже приведены некоторые поддельные данные.Я притворяюсь, что это бэкэнд API:

#call 1
week1 <- as_tibble(list(week = rep(1,7),value = rnorm(7,0,1)))

#call 2
week2 <- as_tibble(list(week = rep(2,7),value = rnorm(7,0,1)))

#call 3
week3 <- as_tibble(list(week = rep(3,7),value = rnorm(7,0,1)))

#append
pretend_full_api_data <- bind_rows(week1, week2, week3)

Эта функция работает

by_api_call <- function(weeknumber){
  weeki <- pretend_full_api_data %>%
    filter(week == weeknumber)
}

seq(from = 1, to = 3) %>% 
map_df(~by_api_call(.))

Проблема в том, что API часто требует времени ожидания.Поэтому я попытался изменить следующим образом:

by_api_call <- function(weeknumber){
  weeki <- pretend_full_api_data %>%
    filter(week == weeknumber)
    Sys.sleep(2) #required sleep for API calls
}

seq(from = 1, to = 3) %>% 
map_df(~by_api_call(.))

Приведенный выше код возвращает 0 rows.В чем проблема с вышеуказанной функцией?

1 Ответ

0 голосов
/ 10 июня 2018

На самом деле это не работает, потому что функция by_api_call ничего не возвращает.Вам нужно добавить функцию return для фактического извлечения чего-либо из вашей функции.

Если вам нужно увидеть техническое обсуждение, см. Книгу Advanced R Хэдли Уикхэма (Самый ценный игрокна языке R).

Ваш код нуждается в этой настройке, чтобы фактически выполнить желаемую работу

# API stuff..

# this is the function that actually works...

by_api_call <- function(weeknumber){
  weeki <- pretend_full_api_data %>%
    filter(week == weeknumber)
    Sys.sleep(2) #required sleep for API calls

  return(weeki) # return is your friend...
}

# calling the API function
week_numbers <- seq(from = 1, to = 3, by = 1)

(map_df(week_numbers, by_api_call))

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