R - 在for循环中使用多个函数会导致错误 - 他们为Hansard API工作

时间:2015-07-04 17:01:53

标签: r function for-loop web-scraping

基本上,我要做的是生成一个.csv文件,其中包含使用theyworkforyou.co.uk API在给定时间范围内来自英国公民的所有演讲。我写了一个收集数据的函数:

getData <- function(url){
  require(jsonlite)
  raw.data <- readLines(url, warn="F")
  rd <- fromJSON(raw.data)
  rd <- as.data.frame(rd)
  return(rd)
}

其中url将被定义为给定的MP,它们为您的ID工作,如此列表中包含650个条目:

MP.ID <- as.list(MP.df$Person.ID) # All the MPs' ID's, e.g. 11111 for Ms. Smith
Scraper <- paste0("http://www.theyworkforyou.com/api/getHansard?key=SECRET=",MP.ID,"&year=2015&order=d&num=1000&output=js")

所以,例如,这个命令

test.df <- getData(Scraper[1]) 

会在数据框中返回文本数据(加上一些辅助内容)。

然后,我的下一个函数清除文本并留下相关信息并将其保存到包含csv标题中相应MP的ID的.csv中,以便唯一标识它:

textClean <- function(scrapedData){
  Speaker.ID <- scrapedData$rows.person_id[1]
  slimScrape <- scrapedData[c(9,16,20)]
  slimScrape$Year <- substr(slimScrape$rows.hdate,1,4)
  slimScrape$Year <- as.numeric(slimScrape$Year)
  slimScrape <- subset(slimScrape,Year==2015)
  colnames(slimScrape) <- c("Date","Person.ID","Text.Full","Year")
  write.csv(slimScrape,file = paste0("HansardScrapes/","hansard",Speaker.ID,".csv"))
}

这适用于单个案例(即先前生成的test.df),将正确的文件保存到所需的位置。

现在出现了问题。我想为所有650 MP调整此循环。它不会工作。它返回以下错误消息:

  

“错误:尝试应用非功能”

当我尝试运行此循环时:

for(i in 1:650(Scraper)){
  Contributions <- getData(Scraper[i])
  textClean(Contributions)
}

再次,如果这是一个非常无聊的问题我很抱歉,答案是完全明显的。我尝试过用lapply和sapply工作,但我无法完全理解他们的工作。此外,它也不起作用:)。

2 个答案:

答案 0 :(得分:0)

试试这个(循环通过MP.ID)

lapply(MP.ID, function(mpid){
url <- paste0("http://www.theyworkforyou.com/api/getHansard?key=SECRET=",mpid,"&year=2015&order=d&num=1000&output=js")
scrapedData <- getData(url) 
textClean (scrapedData)
})

答案 1 :(得分:0)

循环错误,请尝试:

for(i in 1:650){
  Contributions <- getData(Scraper[i])
  textClean(Contributions)
}

你使用的650(Scraper)试图在Scraper上调用一个名为650的函数(它不存在且不存在)。你可以尝试:

 for(i in 1:length(Scraper)){...

更具普遍性。

此外,您应该将命令require(jsonlite)移出功能 - 否则每当您只需要在会话中调用它时它就会调用它。

如果这不能解决您的问题,请粘贴dput(test.df),否则要测试它,我们必须注册API密钥。