有什么很好的例子说明什么时候seq_along
会起作用,但seq
会产生意想不到的结果?
从文档中?seq
我们可以得到:
请注意,它与第一个参数的类一起分派,而与参数名称无关。如果只用一个参数调用它,这可能会产生意想不到的后果
along.with
:seq_along
在这种情况下,使用它会更好。
Answers:
这应该使区别清楚。基本上,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()
表现出类似的肮脏行为:
sample(a)
# [1] 10 8 9
sample(b)
# [1] 9 10
sample(c)
# [1] 8 7 9 3 4 1 6 10 2 5
sample()
或只是使用as.numeric(sample(as.character(c)))
?
safeSample <- function(x) if(length(x) == 1) x else sample(x)
。(尝试一下safeSample(4:5); safeSample(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
diag
也一样