Boucler sur un objet datetime résultats dans un itérateur numérique
Pourquoi ne itération à travers un Date
ou POSIXct
objet de résultat dans numeric
? Par exemple:
test = as.Date("2009-01-01")
print( class( test ) )
# [1] "Date"
for ( day in test )
{
print( class( day ) )
}
# [1] "numeric"
La même chose arrive avec POSIXct
:
test = as.POSIXct("2009-01-01")
print( class( test ) )
# [1] "POSIXct" "POSIXt"
for ( day in test )
{
print( class( day ) )
}
# [1] "numeric"
comme.numérique(test) est essentiellement le même résultat. c'est à dire, le nombre de jours à partir de l'époque 1970-01-01.
Ce serait le travail:
a le droit de répondre à ce qui aurait été la première question, qui est de savoir comment faire
Ce serait le travail:
for(d in as.list(test)) print(class(test))
a le droit de répondre à ce qui aurait été la première question, qui est de savoir comment faire
for
faire ce que presque tout le monde veut vraiment en faire un vecteur? liste? quoi que ce soit) de dates.
OriginalL'auteur SFun28 | 2011-06-22
Vous devez vous connecter pour publier un commentaire.
?"for"
dit queseq
(la partie aprèsin
) est Un[traduction] "l'expression de l'évaluation d'un vecteur (y compris une liste et une expression) ou à un pairlist ou 'NULL'".De sorte que votre
Date
vecteur est contraint ànumeric
parce queDate
les objets ne sont pas strictement vecteurs:La même chose est vraie pour
POSIXct
vecteurs:C'est une distinction subtile que peu de gens vont comprendre ou apprécier. Oui,
for
ne coupons pas les attributs et les appelercoerceVector
sur l'itérateur (et potentiellement créer une copie). Il ignore simplement les attributs. Peu importe, la pratique, l'effet est le même. Avais-je dit "traitées" au lieu de "contrainte", on n'aurait pas eu le point de faire.Il serait plus simple d'admettre que les objets Date "vecteurs" dans le sens que la plupart des gens à comprendre le terme, mais avec un attribut qui est perdu. Par exemple,
is.atomic(SysDate())
retourneTRUE
. Ce qui est vraiment surprenant notion pour moi en tout cas, c'est que pour des boucles va parcourir les listes.c'est probablement parce que si vous ne
is.vector(as.list(as.Date("2009-01-01")))
il sera de retourTRUE
Et ne vous méprenez pas mon commentaire, c'est un point intéressant, mais je ne pense pas que la plupart des gens de soins. 😉
OriginalL'auteur Joshua Ulrich
boucle par jours (chaînes de caractères):
OriginalL'auteur pleo
Que vous ne choisissez pas le droit de la fonction à appliquer à
Date
vecteurs lors de l'utilisation de boucles. Mieux serait d'emballageseq_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 le
is.vector
fonction est un peu mal étiquetés ou peut-être juste mal compris. Il pourrait s'appeler plus précisémenthasNoAttributesOtherThanName
. La propriété que la plupart des gens considèrent "vectoric" est testé avecis.atomic
etDate
etPOSIXct
objets sera de retourTRUE
à partir de ce test.hasNoAttributesOtherThanName
, mais je pense qu'il devrait être nomméhas_no_attributes_other_than_name
. 😉Votre " a) le point est valide, mais en ce qui concerne 'b)', les docs pour
for
dire "Siseq
est de longueur zéro, le corps de la boucle est ignorée."Dans ce cas, il ne pourrait pas faire une différence, mais dans le cas que la personne a été à l'aide de 1:length(x) qu'ils obtiennent itérations qu'ils ne devraient pas voulez obtenir. Une utilisation plus sûre de seq_along().
OriginalL'auteur 42-
Il semble que la fonction C qui implémente l'
for
boucle ne pas copier tout le vecteur d'attributs. Cela inclut également laclass
attribut, ce qui devrait rendrei
semblent être unDate
objet.Vous pouvez étudier le code source de la
do_for(SEXP, SEXP, SEXP, SEXP)
fonction (celui qui est appelé par Rfor
) ici.OriginalL'auteur gagolews
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
:Que 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.OriginalL'auteur Eduardo
Tout numérique de l'opération sur les objets date généralement retourne le nombre de jours. En cela, vous êtes en lui demandant de vous fournir le nombre de jours à partir de l'époque. 14245 qui est le nombre de jours entre 1970-01-01 - 2009-01-01
?Dates:
Essayez d'ajouter
print(day)
pour voir ce que je veux dire.Si vous voulez faire une boucle par le nombre de jours, l'utilisation
for(1:as.numeric(test))
Votre déclaration est de simplement retourner le nombre de jours entre l'épreuve et le 1970-01-01. Ou,
day:test
mais ce que vous voulez vraiment est quelque chose comme1:day:test
Je suppose que je suis juste de ne pas l'avoir vu. Corrigez-moi si je me trompe, mais j'ai lu "( jour de test) " "itérer sur chaque élément de test et d'affecter la valeur de la variable de jour"
Droit, mais ce n'est pas souvent une chose utile à faire. 1970 n'était pas que la grande un an. 😉 @SFun28 était intéressé à une itération à travers les multiples entrées de
test
, non pas de quelque externes date de début de l'test
. Et sitest
a longueur de plus de 1,1:as.numeric(test)
émet un avertissement sévère et rejette tous, mais le premier élément.OriginalL'auteur Brandon Bertelsen