将函数应用于日期列表

时间:2014-03-05 22:20:07

标签: r loops for-loop twitter apply

早上好![/ p>

我有一个关于函数循环的问题。我花了几个小时试图解决它,我怀疑答案在那里我只是不太了解正确的问题,所以我会试着在这里说清楚。我正在使用twitteR()包下拉推文并尝试编写一个可以指定日期范围的函数,它将在该范围内每天推送推文,例如天1:10并且它会下调推文从{1:2 2:3 ... 9:10}

searchtwitter()函数中有一个地方,因为=“”和直到=“”这些数据的格式为“yyyy-mm-dd”。因此,我的方法是尝试使用说x<-seq(as.Date(x), length.out="", by="1 day")生成日期序列,然后从第二天开始生成另一个日期序列。这给了我们两个序列,比如说x和y。然后我想将searchtwitter()函数应用于那些以生成每个x和y值的推文列表。我最初只是尝试使用sapply()函数执行此操作,如下所示

sapply(x, searchTwitter("qantas", n=1, cainfo="cacert.pem", retryOnRateLimit=99999, since=x))

然而,这不是正常的,因为我认为日期被视为chr导致错误?

非常感谢任何帮助。

2 个答案:

答案 0 :(得分:0)

假设xy包含您要在其间查询的日期,(注意,...只是意味着您输入的其余参数,我只是去懒惰):

mapply(function(a, b) searchTwitter(since=a, until=b, "qantas", ...), x, y)

应该有效。无论何时使用apply样式函数,FUN参数都必须是函数,而不是函数的调用。在您的情况下,您正在使用调用来执行某项功能。在这种情况下,我们创建了一个接受两个参数的函数,并将其包装在searchTwitter左右,以便我们可以显式指定sinceuntil参数。

如果searchTwitter只需要一个日期参数,那么您可以执行以下操作:

sapply(x, function(a) searchTwitter(since=a, ...))

注意sapply函数是第二个参数。最后,如果sinceseachTwitter的第一个正式参数,那么您将不需要包装器并且可以直接执行此操作:

sapply(x, searchTwitter, n=1, cainfo=...)

注意我们如何将函数作为第二个参数传递,而不是函数调用。仅当您应用的值旨在进入函数的第一个参数时,此方法才有效。否则,您需要如前面示例中所示的包装器。这些示例中的包装器不是函数调用,而是实际的函数对象。

我的意思是呼叫与功能的一些例子:

  • mean(1:3)#这是一个电话
  • mean#这是一个功能
  • function(x) sum(x)/count(x)#这也是一个功能
  • (function(x) sum(x)/count(x))(1:3)#这是一个电话

基本上,调用返回函数的结果,而函数返回函数本身。在命令行中键入以上内容以查看我的意思。

答案 1 :(得分:0)

试试这个:

library(twitteR)
dates <- as.Date(0:9,origin="2014-01-01")  # first 10 days of 2014
get.tweets <- function(date) {
  searchTwitter("qantas", n=1, cainfo="cacert.pem", retryOnRateLimit=99999, 
                since=as.character(date), until=as.character(date+1))
}
tweets <- sapply(dates,get.tweets)

这(应该......)在2014年的前10天一次抓一条推文。当我运行时,对searchTwitter(...)的调用失败,因为我没有通过身份验证。

请注意since=...until=...是字符,而不是日期。为清楚起见,我单独创建了函数get.tweets(date),但您可以使用在sapply(...)调用中定义的“匿名”函数:

tweets <- sapply(dates,function(date)     
              searchTwitter("qantas", n=1, cainfo="cacert.pem", 
                            retryOnRateLimit=99999, 
                            since=as.character(date), 
                            until=as.character(date+1)))

最后,如果您有两组日期,则可以使用sapply(...)

since <- as.Date(0:9,origin="2014-01-01")  # first 10 days of Jan 2014
until <- as.Date(0:9,origin="2014-02-01")  # first 10 days of Feb 2014
dates <- data.frame(since,until)
get.tweets <- function(i) {
  searchTwitter("qantas", n=1, cainfo="cacert.pem", retryOnRateLimit=99999, 
                since=as.character(dates[i,]$since), 
                until=as.character(dates[i,]$until))
}
tweets <- sapply(1:10,get.tweets)

这只是将sinceuntil值绑定到数据框(称为dates),然后将dates的行索引传递给sapply(...)中的函数1}}。