Seq vs seq_along. Когда использование seq приведет к непреднамеренным результатам?
Что такое (есть?) хорошие примеры того, когда seq_along
будет работать, но seq
приведет к непредвиденным результатам.
Из документации ?seq
имеем:
Обратите внимание, что он отправляет по классу первого аргумента независимо от имен аргументов. Это может иметь непреднамеренные последствия если он вызван только одним аргументом, намеревающимся принять это как с.: гораздо лучше использовать seg_along в этом случае.
Ответы
Ответ 1
Это должно сделать разницу понятной. В принципе, 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
Ответ 2
Если вход для 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