在日期时间对象上循环将导致数字迭代器

问题描述

| 为什么遍历
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
in
之后的部分)是\“ [A] n表达式,其值是向量(包括列表和表达式)或成对列表或\'NULL \'\”。 因此,您的
Date
向量被强制为
numeric
,因为
Date
对象不是严格的向量:
is.vector(Sys.Date())
# [1] FALSE
is.vector(as.numeric(Sys.Date()))
# [1] TRUE
POSIXct
向量也是如此:
is.vector(Sys.time())
# [1] FALSE
is.vector(as.numeric(Sys.time()))
# [1] TRUE
    ,        遍历天数(字符串):
     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循环时,您没有选择正确的函数应用于
Date
向量。最好将
seq_along
换成几乎每个循环的日期或因素。然后,您将做两件事:a)对其进行设置,以便期望索引从1开始,并且b)防止零长度向量发生的奇怪现象。我还认为将它与因子一起使用会更好,for循环将转化为字符向量。 关于约书亚的答案(肯定是正确和有用的),我认为
is.vector
函数的标签有点误解,或者只是被误解了。它可以更准确地称为“ 19”。大多数人认为\ vector的属性是用
is.atomic
和tested0ѭ和
POSIXct
对象测试的,将从该测试返回
TRUE
。     ,        似乎实现
for
循环的C函数不会复制该向量的任何属性。这还包括“ 25”属性,应使“ 26”看起来像是“ 0”对象。 您可以在此处学习
do_for(SEXP,SEXP,SEXP)
函数的源代码(R \的
for
调用的源代码)。     ,        这是一个古老的问题,但是我是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
最终会表现出不同的行为,但对于我的目的却起作用,并且希望对其他人有用。     ,        对日期对象的任何数字运算通常都会返回天数。在此,您要求它为您提供距纪元的天数。 14245,这是1970-01-01-2009-01-01之间的天数 从?日期:   日期表示为   1970年1月1日以来的天数,负数   较早日期的值。他们是   始终遵循以下规则打印   当前的公历,甚至   尽管该日历未使用   很久以前(它于1752年在   英国及其殖民地)。      预期日期应为   整数,但不强制执行   在内部表示中。   小数日将被忽略   印刷。有可能产生   通过均值方法的分数天或   通过加或减(请参见   行动日期)。 尝试加
print(day)
以了解我的意思。
test = as.Date(\"2009-01-01\")
print( class( test ) )
for ( day in test )
{
  print(day)
  print( class( day ) )
}