50 votes

Le bouclage sur un objet Date donne un itérateur numérique

Pourquoi l'itération d'une date donne-t-elle un résultat numérique? Par exemple:

 test = as.Date("2009-01-01")
print( class( test ) )
# [1] "Date"
for ( day in test )
{
    print( class( day ) )
}
# [1] "numeric"
 

37voto

Joshua Ulrich Points 68776

?"for" dit que seq (la partie après in ) est "[A] n expression évaluant un vecteur (y compris une liste et une expression) ou un pairlist ou 'NULL' ".

Ainsi, votre vecteur Date est contraint à numeric car les objets Date ne sont pas strictement des vecteurs:

 is.vector(Sys.Date())
# [1] FALSE
is.vector(as.numeric(Sys.Date()))
# [1] TRUE
 

24voto

pleo Points 81

boucle à travers les jours (chaînes):

      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])
      }
 

19voto

BondedDust Points 105234

Vous n'êtes pas choisir la bonne fonction à appliquer à la Date de vecteurs lors de l'utilisation de boucles. Mieux serait d'emballage seq_along() pour à peu près chaque jour ou facteur qui est en boucle partout. Ensuite, vous allez faire deux chose: a) de mettre en place, donc vous vous attendez à un index qui commence à 1, et b) de se protéger contre les choses étranges qui se produisent avec une longueur de zéro vecteurs. Je pense aussi qu'il serait préférable de l'utiliser à d'autres facteurs, dont les boucles se transforme en personnage de vecteurs.

Avec référence à Josué de la réponse (qui est certainement juste et utile), je pense que l' is.vector fonction est un peu mal étiquetés ou peut-être juste mal compris. Il pourrait s'appeler plus précisément hasNoAttributesOtherThanName. La propriété que la plupart des gens considèrent "vectoric" est testé avec is.atomic , la Date et l'POSIXct objets sera de retour TRUE de ce test.

9voto

gagolews Points 6205

Il semble que la fonction C qui implémente la boucle for ne copie aucun des attributs du vecteur. Cela inclut également l'attribut class , qui devrait faire apparaître i comme un objet Date .

Vous pouvez étudier le code source de la fonction do_for(SEXP, SEXP, SEXP, SEXP) (celle appelée par R for ) ici .

6voto

Eduardo Points 1146

C'est une vieille question, mais je suis un novice sur R et face au même problème. Depuis mon problème serait traité en parallèle, j'ai utilisé foreach et vu le comportement est différent par rapport à la normale 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"
...

Comme je ne suis pas vécu de l'intérieur les choses de la plupart de R, donc je ne sais pas pourquoi, foreach finit par avoir un comportement différent, mais qui a fonctionné pour mon but, et j'espère que pourrait être utile pour quelqu'un d'autre.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X