2014-03-05 65 views
1

早上好!在日期列表中应用函数

我有一个关于函数循环的问题。我花了几个小时试图弄清楚,我怀疑答案是在那里,我只是不知道要问的正确问题,所以我会尝试在这里阐述它。我正在使用twitteR()软件包来下拉鸣叫,并试图编写一个函数,您可以指定一个日期范围,并且它会在该范围内的每一天下拉鸣叫,例如,天数为1点10分,并且它会下拉鸣叫从{1:2 2:3 ... 9:10}

searchtwitter()函数中有一个用于since =“”和until =“”的位置,这些数据采用格式为“yyyy-mm-dd ”。因此,我的方法是尝试使用say 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处理?

任何帮助,非常感谢。

+0

这是很难看到你的函数窃听而不包括这里的代码。我想像你必须创建每一天的序列中的一个循环,并在粘贴功能包的序列。即:X < - 糊(SEQ(来自= as.Date(x)中,以= as.Date(Y))) – maloneypatr

回答

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功能是第二个参数。最后,如果since人的seachTwitter第一个正式的说法,那么你就不需要包装,并能够直接做到这一点:

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

注意我们是如何将一个函数作为第二个参数,而不是一个函数调用。这只有在你正在应用的值打算进入函数的第一个参数时才有效。否则,您需要使用前面示例中所示的包装器。这些例子中的包装不是函数调用,而是实际的函数对象。

我的意思是通过电话与一些例子比较功能:

  • mean(1:3)#这是呼叫
  • mean#这是一个函数
  • function(x) sum(x)/count(x)#这是一个函数太
  • (function(x) sum(x)/count(x))(1:3)#这是呼叫

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

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),然后传递的datessapply(...)的行索引的功能。