Was sind Beispiele dafür, wann seq_along funktioniert, aber seq unbeabsichtigte Ergebnisse liefert?

76

Was sind gute Beispiele dafür, wann seq_alongfunktioniert, aber sequnbeabsichtigte Ergebnisse erzielt werden?

Aus der Dokumentation von haben ?seqwir:

Beachten Sie, dass die Klasse des ersten Arguments unabhängig von den Argumentnamen ausgelöst wird. Dies kann unbeabsichtigte Konsequenzen haben, wenn nur ein Argument aufgerufen wird, mit dem dies verstanden werden soll along.with: seq_alongIn diesem Fall ist es viel besser, es zu verwenden .

Ricardo Saporta
quelle

Antworten:

119

Dies sollte den Unterschied deutlich machen. Grundsätzlich seq()verhält es sich so, seq_along() außer wenn ein Vektor der Länge 1 übergeben wird. In diesem Fall verhält es sich wie seq_len(). Wenn dich das jemals beißt, wirst du es nie seq()wieder benutzen !

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

Es ist wahrscheinlich erwähnenswert, dass es ein sample()ähnlich mieses Verhalten zeigt:

sample(a)
# [1] 10  8  9
sample(b)
# [1]  9 10
sample(c)
# [1]  8  7  9  3  4  1  6 10  2  5
Josh O'Brien
quelle
6
diagauch.
Flodel
Gibt es eine Alternative zu sample()dann oder nur zu verwenden as.numeric(sample(as.character(c)))?
user1317221_G
6
@ user1317221_G - Ich habe gerade diese Art von Idee verwendet : safeSample <- function(x) if(length(x) == 1) x else sample(x). (Probieren Sie es aus mit safeSample(4:5); safeSample(5).)
Josh O'Brien
Seufz Dieser traurige Moment, in dem ein einzelner Benutzer alle Antworten gepostet hat, nach denen Sie suchen, und Sie 2 Tage warten müssen, um das serielle Upvote-Skript zu befürchten :(
Bhargav Rao
@ BhargavRao Haha. Danke für das Kompliment;)
Josh O'Brien
26

Wenn der Eingang zu seq die Länge 1 hat, sind die Ausgänge zwischen seqund seq_alongunterschiedlich

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

Wir sehen auch einen Unterschied, wenn die Eingabe ein Vektor von Daten ist

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
Dason
quelle
6
Dieses Datumsbeispiel ist großartig!
Ricardo Saporta