2017-01-31 2 views
1

Ich habe eine einfache Schleife erstellt, um die Effizienz einiger simulierter Daten zu berechnen. Es führt sehr gut, während als Schleife:falsche Ausgabe von For-Schleife innerhalb der Funktion

NSE_cal <- NULL 

for(i in 1:6) { 
Qobs <- flowSummary_NSE1[[i]][[3]] 
Qsim <- flowSummary_NSE1[[i]][[1]] 
object_cal <- NSEsums("NSE") 
NSE_cal <- c(NSE_cal, object_cal) 
} 

#NSE_cal 
#[1] 0.8466699 0.7577019 0.8128499 0.9163561 0.7868013 0.8462228 

Allerdings möchte ich diese Schleife gelten ein paar Mal - ich das Objekt flowSummary_NSE# verändern müssen, und ich habe vier verschiedene Transformationsarten anzuwenden. Als Anfang habe ich die Schleife in einer Funktion, mit nur transformation benötigen angegeben werden, etwa so:

badFunction <- function(transformation){ 

NSE_cal <- NULL 

for(i in 1:6) { 
    Qobs <- flowSummary_NSE1[[i]][[3]] 
    Qsim <- flowSummary_NSE1[[i]][[1]] 
    object_cal <- NSEsums(transformation) 
    NSE_cal <- c(NSE_cal, object_cal) 
} 
    print(NSE_cal) 
} 

badFunction("NSE") 
# [1] 0.8462228 0.8462228 0.8462228 0.8462228 0.8462228 0.8462228 

Die Funktion hat genau die gleiche Informationseingabe wie in dem for-Schleife auf seinem eigenen, mit der Ausnahme, für aus irgendeinem Grund gibt es den gleichen Wert für jeden Fall von i aus.

Es ist klar, dass ich etwas falsch gemacht habe. Aber soweit ich sehen kann, muss es etwas Einfaches sein, das in der Funktion selbst enthalten ist. Allerdings einhüllen es ein Fehler an anderer Stelle ist, habe ich den Code angebracht, die die erforderlichen Daten und abhängigen Funktionen (here)

Jede Hilfe viel

Antwort

1

Sie benötigen würde geschätzt erzeugt Objekte in die verschachtelte Funktion als Argumente zu übergeben .

In Ihrem function_NSEsums.r Skript die erste Zeile ändern, um NSEsums <- function(i, Qobs, Qsim) {

In Ihrem example_script.r Ihren Code wie folgt ändern:

badFunction <- function(transformation){ 

    NSE_cal <- NULL 

    for(i in 1:6) { 
    Qobs <- flowSummary_NSE1[[i]][[3]] 
    Qsim <- flowSummary_NSE1[[i]][[1]] 
    object_cal <- NSEsums(transformation, Qobs = Qobs, Qsim = Qsim) 
    NSE_cal <- c(NSE_cal, object_cal) 
    } 

    print(NSE_cal) 

} 

badFunction("NSE") 

[1] 0.8466699 0.7577019 0.8128499 0.9163561 0.7868013 0.8462228 
+1

Danke, dass Sie sich die Zeit nehmen in den abhängigen Materialien suchen ; Ich war mir sicher, dass ich schon jeden einzelnen Teil durchgegangen war. Die Lösung scheint jetzt ziemlich offensichtlich! Ich füge das meiner Liste von Dingen hinzu, um das nächste Mal zu versuchen, dass eine for-Schleife in einer Funktion nicht funktioniert – Visser

+1

Ihr sehr willkommen. Nur zur Erinnerung, Ihre schlechte Funktion würde nicht 0.846 .. sechs Mal ausgegeben haben, wenn Sie die globale Umgebung vor dem Ausführen gelöscht haben. Es zog Qobs und Qsim von dort, daher jedes Mal den gleichen Wert. –

+1

Das macht Sinn! Ich habe immer die einfache Schleife davor ausgeführt, damit ich bestätigen konnte, dass die Ausgabe korrekt war. Ich füge das zur Liste der Dinge hinzu, die ich beim nächsten Mal ausprobieren sollte. Danke für Ihre hervorragende Beratung – Visser

Verwandte Themen