如何通过对列表进行子集化来修复 R 中的下标越界?

How to fix subscript out of bounds in R from subsetting a list?

我对 R 还很陌生。我决定在自己的学习过程中抓取我最喜欢的广播电台正在播放的曲目,然后将这些歌曲添加到我的 spotify 播放列表中。这样我就可以在没有任何广告的情况下收听我喜欢的电台的音乐了

什么进展顺利?

我可以抓取歌曲并将测试歌曲添加到我的 spotify 播放列表中。

哪里出错了?

通过 spotify API 我根据艺术家和标题检索有关歌曲的所有信息。我只需要收到的每个回复中的 spotify:track:xxxxx 部分。当我尝试从每个响应中提取部分 spotify: track: (track uri) 时,我收到错误:下标越界:

### 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 部分的下标越界错误?

得到解决方案。所以对于任何好奇的人。我就是这样修复它的:

# 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+"))