Подтвердить что ты не робот

Seq vs seq_along. Когда использование seq приведет к непреднамеренным результатам?

Что такое (есть?) хорошие примеры того, когда seq_along будет работать, но seq приведет к непредвиденным результатам.

Из документации ?seq имеем:

Обратите внимание, что он отправляет по классу первого аргумента независимо от имен аргументов. Это может иметь непреднамеренные последствия если он вызван только одним аргументом, намеревающимся принять это как с.: гораздо лучше использовать seg_along в этом случае.

4b9b3361

Ответ 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