R - Trycatch正在保存警告而不是返回功能输出

时间:2018-03-14 12:11:09

标签: r for-loop warnings

我正在尝试使用rtweet从Twitter下载记录。这方面的一个问题是Twitter服务器需要每18000条记录等待15分钟。因此,在记录号码18000之后,我收到一个包含所有记录的数据框,并且有一个很好的警告告诉我等一下。 search_tweets有一个函数参数,用于下载超过18000个名为retryonratelimit的记录。但是,这不起作用,所以我正在探索其他选择。

我制作了一个功能,合并tryCatch来解决这个问题。但是,当弹出18000条记录的警告时,tryCatch会保存警告而不是应该在警告之前吐出的数据框。如果下载了17999条记录就不会做的事情

library(rtweet)
library(RDCOMClient)
library(profvis)

TwitScrape = function(SearchTerm){
  ReturnDF = tryCatch({
    TempList=NULL
    Temp = search_tweets(SearchTerm,n=18000)
    TempList = list(as.data.frame(Temp), SearchTerm)
    return(TempList)
    },
    warning = function(TempList){
      Comb=NULL
      MAXID = min(TempList[[1]]$status_id)
      message("Delay for 15 minutes to accommodate server download limits")
      pause(901)
      TempWarn = search_tweets(TempList[[2]],n=18000, max_id=MAXID)
      TempWarn = as.data.frame(TempWarn)
      Comb = rbind(TempList[[1]], TempWarn)
      CombList = list(Comb, TempList[[2]])
      return(CombList)
    }
      )
  }

Searches = c("#MUFC","#LFC", "#MCFC")
TestExpandList=NULL
TestExpand=NULL
TestExpand2=NULL
for (i in seq_along(Searches)){
  TestExpandList = TwitScrape(SearchTerm =  Searches[i])
  TestExpand = TestExpandList[[1]]
  TestExpand$Cat = Searches[i]
  TestExpand$DownloadDate = Sys.Date()
  TestExpand2 = rbind(TestExpand2, TestExpand)
}

我希望这是有道理的。如果我能提供更多信息,请告诉我。总之,为什么tryCatch保存我的警告而不是我想要的数据框?

2 个答案:

答案 0 :(得分:0)

我不是100%肯定你想要实现的目标,但似乎你使用tryCatch时理解错误。

警告处理程序warning = function(TempList)中的参数是警告本身,即您将其命名为TempList,但这并不意味着它将成为您的TempList变量,它将仍然只是将warning传递给处理程序。

您的函数TwitScrape按惯例返回ReturnDF,因为您没有正确返回任何内容,我想这仍然是您想要的并且没问题。

我会尝试在没有tryCatch

的情况下重新构建您的解决方案

答案 1 :(得分:0)

感谢您的评论。 RolandASc,你是对的。我回到了绘图板。请参阅下面的工作TwitScrape功能:

TwitScrape = function(SearchTerm){
  DF=NULL
  DF = search_tweets(SearchTerm,n=18001)
  Warn = warnings()
if (names(Warn[1]) == "Rate limit exceeded - 88"){
  message("paused")
  pause(910)
  DF2 = search_tweets(SearchTerm,n=18000, max_id = min(DF$status_id))
  DF3 = rbind(DF, DF2)
  return(DF3)
  }
else {
  return(DF)
  }}