【问题标题】:How to write a proper for loop for API calls?如何为 API 调用编写适当的 for 循环?
【发布时间】:2020-02-19 01:34:41
【问题描述】:

我正在尝试编写一个 for 循环,将作者的短 ID 提供给名为 RePEc 的数据库并获取从属关系数据。到目前为止,这就是我所拥有的(注意:USERCODE 仅适用于我的 IP):

url <- "https://api.repec.org/call.cgi?code=USERCODE&getauthorrecordraw="
for(i in 1:length(df_affiliations)){
Sys.sleep(1)
affiliation_fun <- paste(url,df_affiliations$author_reg_1[i])
affiliation_run <- fromJSON(txt=affiliation_fun) %>% select("affiliation") %>% unlist(use.names=FALSE)
affiliation_1 <- paste(unlist(affiliation_run), collapse =" ")
df_affiliations$vector <- rbind(affiliation_1)
}

每次我尝试这个时,我要么只得到最后一个值,要么得到一个 HTTP 错误 400。for 循环不是我的强项。谁能弄清楚我哪里出错了?提前感谢您的帮助!

【问题讨论】:

  • 您可能想要paste0() 而不是paste()。后者从 URL 中插入一个可能不正确的空格。还有class(df_affiliations$author_reg_1[i])是什么?
  • 您好,感谢您的帮助。这是一个字符向量

标签: r for-loop


【解决方案1】:

您的循环在每次迭代时都会覆盖您的输出变量。这里的解决方案是在循环之外初始化一个空向量,然后将值分配给每个索引:

url <- "https://api.repec.org/call.cgi?code=USERCODE&getauthorrecordraw="

#define empty vector
affiliation_1<-vector(length=length(df_affiliations))
for(i in 1:length(df_affiliations)){
  Sys.sleep(1)
  affiliation_fun <- paste0(url,df_affiliations$author_reg_1[i])
  affiliation_run <- fromJSON(affiliation_fun) %>% select(affiliation) %>% unlist(use.names=FALSE)
  affiliation_1[i] <- paste(unlist(affiliation_run), collapse =" ")
}

这是未经测试的,因为该问题不可重现,但应该为您的最终解决方案提供一个起点。

【讨论】:

  • 非常感谢你 - 我知道这是不可重现的,所以你可能忍不住,但我不断收到这个错误:“错误:不能对不存在的列进行子集化.x 列affiliation 不存在。”但是,如果我在没有 for 循环的情况下执行每个单独的步骤,则数据会很好。如果有帮助,“隶属关系”是我得到的 txt 中列出的数据框。知道可能出了什么问题吗?
  • fromJSON 的调用可能没有返回预期结果,从而导致错误。建议重启R会话清空环境看问题是否一致。也可以在循环中添加一个打印语句来监控出错时正在处理哪一行。
  • 非常感谢@Dave2e - 我会这样做的。我将在哪里添加打印语句?最后(即'print [i]')?
  • 如果你在开始时添加它,那么它会显示导致错误的记录。如果您在最后添加它,那么它将显示最后一次成功完成的记录。您的偏好。
  • 这成功了!谢谢您的帮助。不过小问题 - 我想跳过一些错误。你知道我怎样才能运行这个循环,如果它不起作用,只记录“错误”或类似的东西吗?
猜你喜欢
  • 2013-07-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-09-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多