purrr map / lapply / sapply для групп из нескольких (n> 1) элементов одновременно? - PullRequest
0 голосов
/ 16 января 2020

Предположим, что у нас есть вектор, мы можем достаточно просто lapply, sapply или map на 1 элемент за раз.

Есть ли способ сделать то же самое для групп из (> 1) элементов вектора?

Пример

Предположим, мы создаем вызовы API, добавляя к URL-адресу user_identifier s через запятую, например:

user_identifiers <- c("0011399", "0011400", "0013581", "0013769", "0013770", "0018374", 
  "0018376", "0018400", "0018401", "0018410", "0018415", "0018417", 
  "0018419", "0018774", "0018775", "0018776", "0018777", "0018778", 
  "0018779", "0021627", "0023492", "0023508", "0023511", "0023512", 
  "0024120", "0025672", "0025673", "0025675", "0025676", "0028226", 
  "0028227", "0028266", "0028509", "0028510", "0028512", "0028515", 
  "0028518", "0028520", "0028523", "0029160", "0033141", "0034586", 
  "0035035", "0035310", "0035835", "0035841", "0035862", "0036503", 
  "0036580", "0036583", "0036587", "0037577", "0038582", "0038583", 
  "0038587", "0039727", "0039729", "0039731", "0044703", "0044726"
)

get_data <- function(user_identifier) {
  url <- paste0("https://www.myapi.com?userIdentifier=", 
                paste0(user_identifier, collapse=","))
  fromJSON(url)
}

В приведенном выше примере get_data(user_identifiers) будет возвращать ответ API для всех 60 user_identifier с одним запросом.

Но предположим, что API принимает максимум 10 идентификаторов одновременно (поэтому мы не можем сделать все 60 одновременно).

Простым решением может быть просто map / lapply / sapply для каждого элемента, например, sapply(get_data, user_identifiers - это будет нормально работать - однако мы сделаем 60 вызовов API, когда все мы действительно нужно 6. Если бы мы могли map / lapply / sapply по группам из 10 одновременно; это было бы идеально

Вопрос

Существует ли элегантный способ map / lapply / sapply над группами из n элементов одновременно (где п> 1)?

1 Ответ

2 голосов
/ 16 января 2020

Мы можем split user_identifiers в группах по 10 и использовать sapply / map / lapply

sapply(split(user_identifiers, gl(length(user_identifiers)/10, 10)), get_data)

, где gl создает группы от 1 до 6 каждой длины 10.

gl(length(user_identifiers)/10, 10)
# [1] 1 1 1 1 1 1 1 1 1 1 2 2 2 2 2 2 2 2 2 2 3 3 3 3 3 3 3 3 3 3
#     4 4 4 4 4 4 4 4 4 4 5 5 5 5 5 5 5 5 5 5 6 6 6 6 6 6 6 6 6 6
#Levels: 1 2 3 4 5 6

Одни и те же группы могут быть созданы с помощью rep

rep(1:ceiling(length(user_identifiers)/10), each = 10)

Как упоминалось @thelatemail, мы можем использовать cut и указать количество групп для вырезания данных. в

sapply(split(user_identifiers, cut(seq_along(user_identifiers),6)), get_data)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...