【问题标题】:For Loop reading API response with existing Data Frame使用现有数据框循环读取 API 响应
【发布时间】:2017-08-03 19:27:32
【问题描述】:

我有一个数据框:

df

                        NAME      ARTISTNAME                    COL3
1 Everything_Now (continued)     Arcade Fire Everything_Now%20(continued)%20Arcade%20Fire
2             Everything Now     Arcade Fire             Everything%20Now%20Arcade%20Fire
3              Signs of Life     Arcade Fire            Signs%20of%20Life%20Arcade%20Fire
4           Creature Comfort     Arcade Fire           Creature%20Comfort%20Arcade%20Fire
5                  Peter Pan     Arcade Fire                  Peter%20Pan%20Arcade%20Fire
6                  Chemistry     Arcade Fire                    Chemistry%20Arcade%20Fire

我的目标是用 Genius Lyric 的 API 循环这个,以获取 COL3 中每个值的歌词 url。

如果我不循环播放,只为每首歌曲单独播放,那么我的输出将如下所示:

genius_url <- "https://api.genius.com/search?q=Everything_Now%20(continued)%20Arcade%20Fire"
getgeniuslyrics <- GET(genius_url, add_headers(Authorization = HeaderValue))
geniuslyrics <- jsonlite::fromJSON(toJSON(content(getgeniuslyrics)))
answer <- data.frame(geniuslyrics$response$hits$result$url[1])
answer

  X.https...genius.com.Arcade.fire.everything.now.continued.lyrics.
1    https://genius.com/Arcade-fire-everything-now-continued-lyrics 

str(answer)

'data.frame':   1 obs. of  1 variable:
$ X.https...genius.com.Arcade.fire.everything.now.continued.lyrics.: Factor w/ 1 level "https://genius.com/Arcade-fire-everything-now-continued-lyrics": 1

到目前为止,这是我对 for 循环的尝试,但出现错误:

for(i in 1:length(df[,3])) {
  genius_url <- paste("https://api.genius.com/search?q=", 
                      df3[i,3], 
                      sep="")
  getgeniuslyrics <- GET(genius_url, add_headers(Authorization = HeaderValue))
  geniuslyrics <- jsonlite::fromJSON(toJSON(content(getgeniuslyrics)))
  answer <- data.frame(geniuslyrics$response$hits$result$url[1])
  df[i,4] <- answer[1,]
}

我得到的错误信息是:

Error in x[...] <- m : replacement has length zero
In addition: There were 26 warnings (use warnings() to see them)

希望这是有道理的。任何帮助都会很棒,谢谢。

【问题讨论】:

    标签: json r api for-loop httr


    【解决方案1】:

    您的数据框是否已经包含第三列,或者您要从第 1 列和第 2 列创建它?我假设您必须根据第一列和第二列创建第三列。

    尝试以类似格式的函数重写一次试验:

     funfun <- function(...){
      x=unlist(list(...))
      A=paste(unlist(lapply(x,strsplit," ")),collapse = "%20")
      genius_url=paste0("https://api.genius.com/search?q=",A)
      getgeniuslyrics <- GET(genius_url, add_headers(Authorization = HeaderValue))
      geniuslyrics <- jsonlite::fromJSON(toJSON(content(getgeniuslyrics)))
      answer <- data.frame(geniuslyrics$response$hits$result$url[1])
      answer
      }
    

    nom 也许你可以从这里循环或使用应用函数:

      apply(df[,1:2],1,funfun)
    

    如果你有第三列,那么你的生活会更轻松:

      funfun_1 <- function(x){
        genius_url=paste0("https://api.genius.com/search?q=",x)
        getgeniuslyrics <- GET(genius_url, add_headers(Authorization = HeaderValue))
        geniuslyrics <- jsonlite::fromJSON(toJSON(content(getgeniuslyrics)))
        answer <- data.frame(geniuslyrics$response$hits$result$url[1])
        answer
      }
    sapply(df[,3],funfun_1)
    

    【讨论】:

    • 不客气。只是一个问题。这些功能来自哪个包?我无法弄清楚发生了什么。 jsonlite包有什么作用??
    • 包有:httr、jsonlite、DT、dplyr
    猜你喜欢
    • 2022-08-16
    • 2014-10-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-30
    • 1970-01-01
    • 1970-01-01
    • 2019-08-29
    相关资源
    最近更新 更多