在date时间对象上循环会产生一个数字迭代器
为什么遍历Date
或POSIXct
对象会导致numeric
? 例如:
test = as.Date("2009-01-01") print( class( test ) ) # [1] "Date" for ( day in test ) { print( class( day ) ) } # [1] "numeric"
POSIXct
发生同样的情况:
test = as.POSIXct("2009-01-01") print( class( test ) ) # [1] "POSIXct" "POSIXt" for ( day in test ) { print( class( day ) ) } # [1] "numeric"
?"for"
表示seq
(后面的部分)是“对一个向量(包括一个列表和一个expression式)或一个pairlist或'NULL'进行评估的expression式。
所以你的Date
向量被强制为numeric
因为Date
对象不是严格的向量:
is.vector(Sys.Date()) # [1] FALSE is.vector(as.numeric(Sys.Date())) # [1] TRUE
POSIXct
vector也是如此:
is.vector(Sys.time()) # [1] FALSE is.vector(as.numeric(Sys.time())) # [1] TRUE
循环通过天(string):
days <- seq(from=as.Date('2011-02-01'), to=as.Date("2011-03-02"),by='days' ) for ( i in seq_along(days) ) { print(i) print(days[i]) }
在使用for循环时,您没有select适用于Date
向量的正确函数。 更好的做法是包装seq_along
几乎每一个date或因素是循环。 然后你会做两件事情:a)设置它,所以你期望一个从1开始的索引,和b)防止零长度向量发生的奇怪事情。 我也认为使用它的因素会更好,for循环会变成字符向量。
关于约书亚的答案(这当然是正确的和有帮助的),我认为is.vector
函数有点错误标记,或者只是误解了。 可以更准确地将其称为hasNoAttributesOtherThanName
。 大多数人认为“vector”的属性用is.atomic
进行testing, Date
和POSIXct
对象将从该testing返回TRUE
。
看来,实现for
循环的C函数不会复制vector的任何属性。 这还包括class
属性,这应该使i
看起来是一个Date
对象。
您可以在这里学习do_for(SEXP, SEXP, SEXP, SEXP)
函数(R所调用的函数do_for(SEXP, SEXP, SEXP, SEXP)
的源代码。
这是个老问题,但我是R的新手,面临同样的问题。 由于我的问题将被并行处理,我用foreach ,看到行为是不同于正常for
:
library(foreach) start_date = as.Date("2013-08-1") end_date = as.Date("2013-08-13") days = seq(start_date, end_date, by = "day") foreach(day = days, .combine='rbind') %dopar% { print(class(day)) } [1] "Date" [1] "Date" [1] "Date" [1] "Date" ...
由于我没有经历大多数R的内在事情,所以我不知道为什么foreach
最终有不同的行为,但是为我的目的工作,并希望可能对别人有用。
date对象的任何数字操作通常会返回天数。 在这里,你要求它提供从这个时代开始的天数。 14245这是1970-01-01 – 2009-01-01之间的天数
从?date:
date表示为自1970-01-01以来的天数,较早的date为负值。 它们总是按照公历日历的规则打印,即使那个日历早已不被使用(它在1752年被英国及其殖民地采用)。
date应该是一个整数,但这不是在内部表示中强制执行的。 打印时,分数天将被忽略。 可以通过平均方法或者通过加或减(见Ops.Date)来产生分数天。
尝试添加print(day)
,看看我的意思。
test = as.Date("2009-01-01") print( class( test ) ) for ( day in test ) { print(day) print( class( day ) ) }