Манипулирование рекурсивным списком Discogs

Используя Discogs, я получаю список релизов данного джазового музыканта следующим образом:

releases <- list()
artists <- list()
artistURL <- "https://api.discogs.com/artists/"
library(jsonlite)
a <- function(artistcode){
  for(i in 0:3){
    artistset <- fromJSON(paste0(artistURL, artistcode, "/releases?page=", i))
    message("Retrieving page ", i)

    releases[[i+1]] <- (as.data.frame(artistset$releases.main_release))
      }
  return(artistset)
  message("Total rows=", dim(artistset[[2]])[1] )
}

temp<-a('265634') # art tatum 265634
temp$releases$title # shows first 50 albums...where's the rest?

При осмотре вы увидите, что temp — это два списка, а второй называется релизами. В рамках релизов 50 альбомов. Однако я запросил ТРИ страницы вывода в моей команде fromJSON, но у меня есть 22 страницы результатов в temp:

str(temp$pagination)  # there are 22 pages of 50 lines per page

Как извлечь все заголовки и другие данные (на 22 страницы) для этого исполнителя в фрейм данных? Возился с purrr безрезультатно. Спасибо за любую помощь!


person Ben    schedule 09.08.2019    source источник


Ответы (1)


Это должно работать лучше. releases определялся только в рамках вашей функции и не возвращался в глобальную среду. Также изменена функция, чтобы использовать переменную pages в JSON для построения цикла:

a <- function(artistcode){
  releases <- list()
  metadata <- fromJSON(paste0(artistURL, artistcode, "/releases?page=", 1))
  for (i in 1:metadata$`pagination`$pages){
    message("Retrieving page ", i)
    Sys.sleep(2) #added as I was being rate limited
    releases[[i]] <- fromJSON(paste0(artistURL, artistcode, "/releases?page=", i))$releases
  }
  return(releases)
}

temp<-a('265634') # art tatum 265634

temp[[1]] # page 1
temp[[2]] # page 2
person Chris    schedule 09.08.2019
comment
Эй, это здорово @Chris большое спасибо! Я вижу, как вы использовали поле страниц в списке разбиения на страницы для создания функции. - person Ben; 09.08.2019