Які приклади, коли seq_along працює, але seq дає непередбачені результати?


77

Які хороші приклади того, коли seq_alongпрацюватиме, але seqдасть непередбачені результати?

З документації ?seqми маємо:

Зверніть увагу, що він надсилає клас першого аргументу незалежно від імен аргументів. Це може мати непередбачені наслідки, якщо його викликати лише одним аргументом, що передбачає це прийняти як along.with: набагато краще використовувати seq_alongв такому випадку.

Відповіді:


120

Це повинно зробити різницю чіткою. В основному, 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

чи є альтернатива sample()тоді або просто використовувати as.numeric(sample(as.character(c)))?
user1317221_G

6
@ User1317221_G - я просто використав таку ідею: safeSample <- function(x) if(length(x) == 1) x else sample(x). (Спробуйте за допомогою safeSample(4:5); safeSample(5).)
Джош О'Брайен

Зітхніть Цей сумний момент, коли один користувач опублікував усі відповіді, які ви шукаєте, і вам потрібно почекати 2 дні, щоб висловитись, побоюючись серійного сценарію підтримки :(
Bhargav Rao

@BhargavRao Ха-ха. Дякую за комплімент;)
Джош О'Брайен

При застосуванні до порожніх вектором, x <- c(), seq(x)і seq_along(x)як поверненняinteger(0)
Енріке Переса Герреро

26

Якщо вхід у 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

6
цей приклад дати чудовий!
Рікардо Сапорта
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.