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,则seqseq_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