什么是seq_along
何时有用的好例子,但seq
会产生意想不到的结果?
从?seq
的文档中我们有:
请注意,它会调度第一个参数的类 不论参数名称如何。这可能会产生意想不到的后果 如果仅使用一个参数调用它,则将其视为
along.with
:在这种情况下使用seq_along
要好得多。
答案 0 :(得分:107)
这应该明确区别。基本上,seq()
在传递长度为1的向量时会像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
答案 1 :(得分:24)
如果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
如果输入是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