web-dev-qa-db-fra.com

Quels sont les exemples de quand seq_along fonctionne, mais que seq produit des résultats inattendus?

Quels sont de bons exemples de quand seq_along Fonctionnera, mais que seq produira des résultats inattendus?

De la documentation de ?seq Nous avons:

Notez qu'il envoie sur la classe du premier argument quel que soit le nom de l'argument. Cela peut avoir des conséquences inattendues s'il est appelé avec un seul argument qui veut que cela soit pris comme along.with: Il est préférable d'utiliser seq_along Dans ce cas.

65
Ricardo Saporta

Cela devrait faire la différence clairement. Fondamentalement, seq() agit comme seq_along()sauf lorsqu'il est passé à un vecteur de longueur 1, auquel cas il agit comme seq_len(). Si cela vous mord une fois, vous n'utiliserez plus jamais seq()!

a <- c(8, 9, 10)
b <- c(9, 10)
c <- 10

seq_along(a)
# [1] 1 2 3
seq_along(b)
# [1] 1 2
seq_along(c)
# [1] 1

seq(a)
# [1] 1 2 3
seq(b)
# [1] 1 2
seq(c)
# [1]  1  2  3  4  5  6  7  8  9 10

Il est probablement intéressant de noter que sample() présente le même comportement minable:

sample(a)
# [1] 10  8  9
sample(b)
# [1]  9 10
sample(c)
# [1]  8  7  9  3  4  1  6 10  2  5
108
Josh O'Brien

Si l'entrée à seq est de longueur 1, les sorties entre seq et seq_along sera différent

x <- 5
for(i in seq(x)){
    print(x[i])
}
#[1] 5
#[1] NA
#[1] NA
#[1] NA
#[1] NA

for(i in seq_along(x)){
    print(x[i])
}
#[1] 5

Nous constatons également une différence si l’entrée est un vecteur de dates.

x <- Sys.Date() + 1:5
seq(x)
#Error in seq.Date(x) : 'from' must be of length 1
seq_along(x)
#[1] 1 2 3 4 5
25
Dason