seq vs seq_along。 什么时候使用seq会导致意想不到的结果?
什么是seq_along
工作的好例子,但seq
会产生意想不到的结果。
从?seq
的文档我们有:
请注意,它将调用第一个参数的类而不pipe参数名称。 这可能会产生意想不到的后果,如果只有一个参数被调用,意图将其视为一致,那么在这种情况下使用seg_along要好得多。
这应该使差异明确。 基本上, seq()
行为就像seq_along()
除非传递一个长度为1的向量,在这种情况下,它的行为就像seq_len()
。 如果这曾经咬你,你永远不会再使用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
可能值得注意的是, sample()
performance出类似的糟糕行为:
sample(a) # [1] 10 8 9 sample(b) # [1] 9 10 sample(c) # [1] 8 7 9 3 4 1 6 10 2 5
如果seq的input是长度1,则seq
和seq_along
之间的输出将会不同
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
如果input是date向量,我们也会看到差异
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