84 votes

Quels sont les exemples où seq_along fonctionne, mais où seq produit des résultats inattendus ?

Quels sont les bons exemples de cas où seq_along fonctionnera, mais seq produira des résultats inattendus ?

A partir de la documentation de ?seq nous avons :

Notez qu'elle s'exécute sur la classe du premier argument sans tenir compte des noms des arguments. Cela peut avoir des conséquences inattendues si elle est appelée avec un seul argument dans l'intention de faire ce qui suit along.with : il est préférable d'utiliser seq_along dans ce cas.

132voto

Josh O'Brien Points 68397

Cela devrait faire apparaître clairement la différence. En principe, seq() agit comme seq_along() sauf lorsqu'on lui transmet un vecteur de longueur 1, auquel cas il se comporte comme seq_len() . Si cela vous arrive une seule fois, vous n'utiliserez jamais seq() encore !

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 utile de noter que sample() fait preuve d'un comportement tout aussi 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

26voto

Dason Points 18263

Si l'entrée de seq est de longueur 1, les sorties entre seq y seq_along sera différente

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

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