Какие существуют примеры, когда сл вместе работает, но далее выдает неожиданные результаты?


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

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

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

2 59

2 ответа:

это должно сделать различие. В принципе,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

если вход в 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