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 .

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

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

6
Dieses Datumsbeispiel ist großartig!
Ricardo Saporta
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.