2016-11-14 2 views
1

Gibt es eine Möglichkeit, Nullwerte in einem iterativen Prozess zu speichern, wenn eine Bedingung aktiviert ist, um zur nächsten Iteration überzugehen?Die Absicht dieses Problem „wie zu lösen“ ist mit der Struktur selbst der SchleifeSpeichern von Nullwerten beim Überspringen einer Iteration in einer for-Schleife

[CONTEXT]:

ich auf den Fall beziehen, wenn Sie einen Speichermechanismus innerhalb eines verwenden müssen Schleife in Verbindung mit einer bedingten Anweisung, und es wird das Szenario gegeben, in dem grundsätzlich einer der möglichen Pfade nicht von Interesse ist. In der Ehre, die Behandlung im Moment und nicht hinter der Berechnung zu geben, springen Sie zur nächsten Iteration.

[Beispiel]

Angenommen, eine bestimmte Folge von Zahlen gegeben, ich mag nur gespeichert, um die Zahlen der Folge, die größer als 2 in einer Liste.

storeGreaterThan2 <- function(x){ 
y <- list() 
    for (i in seq_along(x)) { 
     if (x[i] > 2) { 
      y[[i]] <- x[i] 
     } else { 
      next 
     } 
    } 
y 
} 

Der bisherige Funktion Deal mit dem Endzweck, aber wenn die Bedingung der Iteration überspringen der fehlende Betrieb im Index aktiviert ist, wird mit einem Null-Wert in der endgültigen Liste gefüllt.

> storeGeaterThan2(1:5) 
[[1]] 
NULL 

[[2]] 
NULL 

[[3]] 
[1] 3 

[[4]] 
[1] 4 

[[5]] 
[1] 5 

Im Geist mit dem Problem in der Struktur der Schleife des Umgangs, wie sie damit umgehen können?

+2

Innerhalb der Schleife verwenden, um die Indexlänge (y) +1, um ein zusätzliches Element hinzuzufügen, zB: y [[length (y) +1]] <- x [i] '. Abhängig von Ihren gewünschten Ergebnissen gibt es mehrere bessere und schnellere Möglichkeiten als die Verwendung einer for-Schleife. – Dave2e

+0

Dies ist eine gute Lösung, um mit dem Problem der NULL-Werte in der gleichen Schleife zu führen. –

Antwort

1

Dies ist ein ziemlich seltsames Beispiel, und ich frage mich, ob es ein x-y problem ist. Es ist vielleicht besser, mehr über Ihre Situation zu sagen und was Sie letztendlich tun möchten. Zum Beispiel gibt es verschiedene Möglichkeiten, dies zu versuchen, abhängig davon, ob die Eingabe der Funktion immer eine aufsteigende Sequenz ist. @ Dave2e's comment, dass es bessere Wege geben wird, je nachdem, was Sie wirklich sind, ist auf der richtigen Stelle, meiner Meinung nach. In jedem Fall können Sie die Elemente NULL einfach entfernen, bevor Sie die Liste zurückgeben. Bedenken Sie:

storeGreaterThan2 <- function(x){ 
    y <- list() 
    for(i in seq_along(x)) { 
     if(x[i] > 2) { 
     y[[i]] <- x[i] 
     } else { 
     next 
     } 
    } 
    y <- y[-which(sapply(y, is.null))] 
    return(y) 
} 
storeGreaterThan2(1:5) 
# [[1]] 
# [1] 3 
# 
# [[2]] 
# [1] 4 
# 
# [[3]] 
# [1] 5 

Hier ist eine Möglichkeit, dies zu tun, ohne jemals das Element NULL gespeichert sind, anstatt sie Reinigung am Ende nach oben:

storeGreaterThan2 <- function(x){ 
    y <- list() 
    l <- 1     # l is an index for the list 
    for(i in seq_along(x)){ # i is an index for the x vector 
    if(x[i] > 2) { 
     y[[l]] <- x[i] 
     l  <- l+1 
    } 
    } 
    return(y) 
} 
+0

Es ist kein x-y-Problem @gung. Ich bearbeite meine Antwort, um mehr Kontext zu geben. –

+0

@ CristóbalAlcázar, fair genug. Würden Sie das Element an dieser Stelle in die Schleife einfügen, wonach Sie suchen? Wären Sie bereit, einen anderen Zähler zu verwenden, um das Element der Liste gegen das Element von x zu verfolgen? – gung

+0

Ihre Antwort löst das Problem. Im Zusammenhang mit dem Kommentar von @ Dave2e löst die Verwendung von length (y) +1 auch das Problem und erfasst, was ich sagen wollte: Vermeiden Sie das Speichern der Nullwerte in der gleichen Schleifensyntax. Ich werde versuchen, die Antwort zu bearbeiten, um damit deutlicher zu werden.Ich habe keinen Hintergrund in einer formalen Programmierung, aber die Hauptabsicht der Frage ist, wie man dieses Problem mit der Struktur selbst der Schleife behandelt –

Verwandte Themen