84

有什么好的例子说明什么时候seq_along会起作用,但seq会产生意想不到的结果?

?seq我们的文档中:

请注意,无论参数名称如何,它都会在第一个参数的类上分派。如果仅使用一个旨在将其视为 的参数来调用它,则可能会产生意想不到的后果 along.with:在这种情况下使用要好得多seq_along

4

2 回答 2

132

这应该清楚地表明差异。基本上,除了传递长度为 1 的向量外,它的行为seq()类似于. 如果这曾经咬过你,你将永远不会再使用!seq_along() 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()表现出同样糟糕的行为:

sample(a)
# [1] 10  8  9
sample(b)
# [1]  9 10
sample(c)
# [1]  8  7  9  3  4  1  6 10  2  5
于 2012-12-05T21:01:40.783 回答
26

如果 seq 的输入长度为 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

如果输入是日期向量,我们也会看到差异

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
于 2012-12-05T20:53:19.467 回答