使用RSpotify调用Spotify API获取多位艺术家流派信息遇问题
获取Spotify艺术家流派的修正方案
看起来你在循环处理艺术家列表获取流派时遇到了代码逻辑问题,我帮你梳理下现有代码的问题并给出修正后的实现:
现有代码的明显问题
artist_info <- character(artist)这里的artist未定义,应该指定与艺术家数量匹配的长度,比如character(nrow(Artist_Nam))searchArtist的调用参数不完整,需要明确传入当前循环的艺术家名字,比如Artist_Nam$你的列名[i]- 使用
ifelse不太适合这里的场景,因为我们需要判断搜索结果是否存在,普通的if-else更直观 - 没有提取
searchArtist返回结果中的genres字段,这才是你需要的流派信息
修正后的循环实现
假设你的Artist_Nam数据框中,艺术家名字的列名为Artist(如果不是,替换成你实际的列名):
# 先确认数据框的列名,确保你用对了艺术家名字的列 colnames(Artist_Nam) # 初始化一个列表来存储每个艺术家的流派(支持多个流派的情况) artist_genres <- vector("list", nrow(Artist_Nam)) names(artist_genres) <- Artist_Nam$Artist # 循环处理每个艺术家 for(i in 1:nrow(Artist_Nam)){ current_artist <- Artist_Nam$Artist[i] # 搜索艺术家,指定type="artist"避免混淆其他类型结果 search_result <- searchArtist(current_artist, type = "artist") # 判断是否找到匹配的艺术家 if(nrow(search_result) > 0){ # 提取第一个匹配结果的流派,转成逗号分隔的字符串 artist_genres[[i]] <- paste(search_result$genres[[1]], collapse = ", ") } else { # 找不到时标记为NA,方便后续处理 artist_genres[[i]] <- NA_character_ } # 可选:添加延迟避免触发Spotify API限流 Sys.sleep(1) } # 转成数据框,方便查看和导出 result_df <- data.frame( Artist = Artist_Nam$Artist, Genres = unlist(artist_genres), stringsAsFactors = FALSE ) # 查看结果 print(result_df)
更简洁的purrr实现(推荐)
如果你熟悉tidyverse工具包,用purrr的map函数可以替代循环,代码更简洁:
library(purrr) library(dplyr) # 定义一个获取单个艺术家流派的函数 get_artist_genres <- function(artist_name){ search_res <- searchArtist(artist_name, type = "artist") if(nrow(search_res) > 0){ paste(search_res$genres[[1]], collapse = ", ") } else { NA_character_ } } # 批量处理艺术家列表 result_df <- Artist_Nam %>% mutate( Genres = map_chr(Artist, ~{ # 添加延迟避免限流 Sys.sleep(1) get_artist_genres(.x) }) )
注意事项
- 确保艺术家名字的拼写准确,否则
searchArtist可能返回空结果 - Spotify API有请求频率限制,批量处理时记得加
Sys.sleep(1)之类的延迟,避免被限流 - 如果搜索返回多个结果(比如同名艺术家),默认取第一个最匹配的,你可以根据需要添加过滤逻辑(比如结合艺术家的热门曲目等信息)
内容的提问来源于stack exchange,提问作者Polly
相关产品推荐
相关产品推荐

