早上好![/ 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导致错误?
非常感谢任何帮助。
答案 0 :(得分:0)
假设x
和y
包含您要在其间查询的日期,(注意,...
只是意味着您输入的其余参数,我只是去懒惰):
mapply(function(a, b) searchTwitter(since=a, until=b, "qantas", ...), x, y)
应该有效。无论何时使用apply
样式函数,FUN参数都必须是函数,而不是函数的调用。在您的情况下,您正在使用调用来执行某项功能。在这种情况下,我们创建了一个接受两个参数的函数,并将其包装在searchTwitter
左右,以便我们可以显式指定since
和until
参数。
如果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)
#这是一个电话基本上,调用返回函数的结果,而函数返回函数本身。在命令行中键入以上内容以查看我的意思。
答案 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)
这只是将since
和until
值绑定到数据框(称为dates
),然后将dates
的行索引传递给sapply(...)
中的函数1}}。