What are good examples of when seq_along
will work, but seq
will produce unintended results?
From the documentation of ?seq
we have:
Note that it dispatches on the class of the first argument irrespective of argument names. This can have unintended consequences if it is called with just one argument intending this to be taken as
along.with
: it is much better to useseq_along
in that case.
seq_along produces the vector of indices of a given vector. seq_len produces the sequence of integer numbers from 1 to length. out.
seq_along() is a function that creates a vector that contains a sequence of numbers from 1 to the length of the object. In this case the object is the vector c , which has a length of 6 elements.
seq_len() function in R Language is used to generate a sequence from 1 to the specified number.
This should make the difference clear. Basically, seq()
acts like seq_along()
except when passed a vector of length 1, in which case it acts like seq_len()
. If this ever once bites you, you'll never use seq()
again!
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
It's probably worth noting that sample()
exhibits similarly crummy behavior:
sample(a) # [1] 10 8 9 sample(b) # [1] 9 10 sample(c) # [1] 8 7 9 3 4 1 6 10 2 5
If the input to seq is length 1 then the outputs between seq
and seq_along
will be different
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
We also see a difference if the input is a vector of 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
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With