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'utiliserseq_along
Dans ce cas.
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
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