有什么好的例子说明什么时候seq_along
会起作用,但seq
会产生意想不到的结果?
从?seq
我们的文档中:
请注意,无论参数名称如何,它都会在第一个参数的类上分派。如果仅使用一个旨在将其视为 的参数来调用它,则可能会产生意想不到的后果
along.with
:在这种情况下使用要好得多seq_along
。
这应该清楚地表明差异。基本上,除了传递长度为 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
如果 seq 的输入长度为 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
如果输入是日期向量,我们也会看到差异
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