首页 > 解决方案 > 为什么我的 R 循环返回越界错误?

问题描述

我正在尝试编写一个从 discogs api 中提取数据的循环函数。我开始编写一个函数'a'并且它有效:

releases <- list()
artists <- list()
artistURL <- "https://api.discogs.com/artists/"

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))
  artists[[i+1]] <- (as.data.frame(artistset$releases.artist ))
}
  return(artistset)
  message("Total rows=", dim(artistset[[2]])[1] )
}
x <- a(135872)

接下来,我现在想将此函数添加到一个循环中,以获取包含在数据框中的一组艺术家的数据,如下所示:

artistdf <- structure(list(
    name = c("Hank Mobley", "Benny Green", "Oscar Peterson", "Art Tatum"), 
    artistcode = c(135872,96442, 254394, 265634)
), .Names = c("name", "artistcode"), row.names = c(NA,-5L), class = c("tbl_df", "tbl", "data.frame"))

for (j in 0:nrow(artistdf)){
    a(artistdf[[j+1, 2]])
}

这是我得到“越界”错误的地方。我使用了一些调试建议,但无济于事。任何人都可以提供解决方案吗?

标签: rloopsdiscogs-api

解决方案


似乎有两个问题。

首先,在您创建artistdf tibble 的地方,您传递“row.names = c(NA,-5L)”,它创建了一个包含5 行的对象,尽管您只有4 行数据。将其更改为 c(NA, -4L)。

其次,从 0 开始最终的 for 循环会产生问题。我不知道为什么会这样,但将其更改如下:

jazzdata <- list()
for (j in 1:nrow(artistdf)){
    jazzdata[[j]] <- a(artistdf[[j, 2]])
}
jazzdata[2] # data are here

通过这两项更改,我能够让您的代码正常工作。


推荐阅读