【发布时间】:2012-12-05 20:43:10
【问题描述】:
什么是seq_along 可以工作但seq 会产生意外结果的好例子?
从?seq 的文档中我们有:
注意它在第一个参数的类上调度 与参数名称无关。这可能会产生意想不到的后果 如果仅使用一个参数调用它,打算将其视为
along.with:在这种情况下使用seq_along会更好。
【问题讨论】:
什么是seq_along 可以工作但seq 会产生意外结果的好例子?
从?seq 的文档中我们有:
注意它在第一个参数的类上调度 与参数名称无关。这可能会产生意想不到的后果 如果仅使用一个参数调用它,打算将其视为
along.with:在这种情况下使用seq_along会更好。
【问题讨论】:
这应该清楚地表明区别。基本上,seq() 在传递长度为 1 的向量时的行为类似于 seq_along() except,在这种情况下,它的行为类似于 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)。)
x <- c()、seq(x) 和 seq_along(x) 都返回 integer(0)
如果 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
【讨论】: