Какие существуют примеры, когда сл вместе работает, но далее выдает неожиданные результаты?
какие хорошие примеры, когда seq_along
будет работать, но seq
приведет к непреднамеренным результатам?
из документации ?seq
у нас есть:
обратите внимание, что он отправляет на класс первый аргумент независимо от имен аргументов. Это может иметь непредвиденные последствия если он вызывается только с одним аргументом, предполагающим, что это будет принято как вдоль.С: в этом случае гораздо лучше использовать seg_along.
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