Как исправить нижний индекс за пределами в R из подмножества списка? - PullRequest
0 голосов
/ 18 июня 2020

Я новичок в R. Я решил для своего собственного процесса обучения очистить треки, которые играет моя любимая радиостанция, а затем добавить эти песни в свой плейлист Spotify. Таким образом я могу слушать музыку c моей любимой радиостанции без рекламы

Что идет хорошо?

Я могу очистить песни и добавить тестовая песня в мой плейлист Spotify.

Где это go неправильно?

Через API spotify я получаю всю информацию о песнях на основе исполнителя и названия. Мне нужна только часть spotify: track: xxxxx каждого ответа, который я получаю. Когда я пытаюсь извлечь часть spotify: track: (track uri) из каждого ответа, я получаю сообщение error: subscript out of bounds:

### Radio2 playlist scraper ###

#Loading packages#
install.packages("rvest")
library(rvest)
install.packages("dplyr")
library("dplyr")
install.packages("remotes")
remotes::install_github("charlie86/spotifyr")
library(spotifyr)
install.packages('knitr', dependencies = TRUE)
library(knitr)
install.packages("stringr")
library("stringr")
install.packages("jsonlite")
library("jsonlite")
library(jsonlite)
library(purrr)
library(data.table)
library(httr)
library(magrittr)
library(rvest)
library(ggplot2)

#Get playlist url #
url <- "https://www.nporadio2.nl/playlist"

#Read HTML code from pagen#
webpage <- read_html(url)

#Get Artist and Title#
artist <- html_nodes(webpage, '.fn-artist')
title <- html_nodes(webpage, '.fn-song')

#Artist and Title to text#
artist_text <- html_text(artist)
title_text <- html_text(title)

#Artist and Title to dataframe#
artiest <- as.data.frame(artist_text)
titel_text <- as.data.frame(title_text)

#Make one dataframe#
radioplaylist <- cbind(artiest$artist_text, titel_text$title_text)
radioplaylist <- as.data.frame(radioplaylist) 
radioplaylist

#Rename columns#
colnames(radioplaylist)[1] <- "Artiest"
colnames(radioplaylist)[2] <- "Titel"
radioplaylist

#Remove duplicate songs#
radioplaylistuniek <- radioplaylist %>% distinct(Artiest, Titel, .keep_all = TRUE)

#Write to csv#
date <- Sys.Date()
date
write.csv(radioplaylistuniek, paste0("C://Users//Kantoor//Radio2playlists//playlist - ", date, ".csv"))

#Set spotify API#
Sys.setenv(SPOTIFY_CLIENT_ID = 'xxxxxxxxxxxxx')
Sys.setenv(SPOTIFY_CLIENT_SECRET = 'xxxxxxxxxxxx')
access_token <- get_spotify_access_token()

# Client and secret#
clientID <- "xxxxxxxxxxxxxxx"
secret <- "xxxxxxxxxxxxxx"

# Get access token and write this to authorization header #
response = POST(
  'https://accounts.spotify.com/api/token',
  accept_json(),
  authenticate(clientID, secret),
  body = list(grant_type = 'client_credentials'),
  encode = 'form',
  verbose()
)

token = content(response)$access_token
authorization.header = paste0("Bearer ", token)

# Generate URLS #
radioplaylistuniektest <- radioplaylistuniek[1:100,]
urls <- list(c("https://api.spotify.com/v1/search?q=track:")) %>% paste0(radioplaylistuniektest$Titel) %>% paste0(c("%20artist:")) %>% paste0(radioplaylistuniektest$Artiest) %>% paste(c("&type=track&limit=1"), sep = "")

# Get track information#
lijstwijk <- lapply(urls, GET, simplifyMatrix=TRUE, flatten=TRUE, config = add_headers(authorization = authorization.header))

# Get trackuri from each response#
lijstwijkuri <- lapply(lijstwijk, function(item) content(item, as="parsed")$tracks$items[[1]]$uri)

Error in content(item, as = "parsed")$tracks$items[[1]] : 
  subscript out of bounds

Когда я удаляю URI дорожки из ответа для нескольких песен , допустим для первых 5, все идет хорошо:

# Generate URLS #
radioplaylistuniektest <- radioplaylistuniek[1:5,]
urls <- list(c("https://api.spotify.com/v1/search?q=track:")) %>% paste0(radioplaylistuniektest$Titel) %>% paste0(c("%20artist:")) %>% paste0(radioplaylistuniektest$Artiest) %>% paste(c("&type=track&limit=1"), sep = "")

# Get track information#
lijstwijk <- lapply(urls, GET, simplifyMatrix=TRUE, flatten=TRUE, config = add_headers(authorization = authorization.header))

# Get trackuri from each response#
lijstwijkuri <- lapply(lijstwijk, function(item) content(item, as="parsed")$tracks$items[[1]]$uri)
lijstwijkuri

[[1]]
[1] "spotify:track:5Xhqe9xu6bKRSqLj1mS1SB"

[[2]]
[1] "spotify:track:21YxK0klhpfLW8budkJaMF"

[[3]]
[1] "spotify:track:468OIV1LzYrm3rluVKl8AU"

[[4]]
[1] "spotify:track:3yDhZq8f17SmumVmEyCaRN"

[[5]]
[1] "spotify:track:0IseLavjQ32B5wxYxWeuw5"

Как исправить ошибку выхода за границы?

Что не так? Как я могу исправить ошибку индекса за пределами для извлечения части spotify: track: xxxx из каждого ответа?

1 Ответ

0 голосов
/ 18 июня 2020

Получил решение. Так что для всех, кому интересно. Вот как я это исправил:

# Unlist results #
responses <- unlist(lapply(lijstwijk, paste, collapse=" "))

# Results to dataframe #
responsesdf <- as.data.frame(responses)

# Get spotify:track string#
uriperurl <- data.frame(uri = str_extract(responsesdf$responses, "(spotify:track:)\\w+"))
...