PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : R <- Rekursion: Speichern einer Variablen



Dude193
20-10-2006, 11:09
Hallo,
ich habe mal wieder ein neues R-Problem mitgebracht. Ich habe folgende Funktion geschrieben:

analyseRecHistSimAgg <- function(treeID, pfID, histSimVecs, eps, refDate) {

#
# operates on global data frame histSimVecs
#

if (treeID == 1) risktype = 10 else risktype = 24
treePrefix <- ifelse(treeID == 1, "y", "z")
childIDs <- aDBTrees$portfolioid[aDBTrees$treeid == treeID & aDBTrees$parentid == pfID]

for (childID in childIDs) {
index <- which(aDBTrees$treeid == treeID & aDBTrees$portfolioid == childID)
if (!aDBTrees$is.leaf[index]) {
aggDifference <- histSimVecs[[refDate]][[paste(sep="",treePrefix,childID)]]
difference <- VarVecs$DIFFERENCE[as.Date(VarVecs$BUSINESSDAY)==(as.Date(refDate)-1) & VarVecs$PORTFOLIOID==childID & VarVecs$RISKTYPEID==risktype]
if (sum((abs(difference - aggDifference)/abs(difference))) > 250 * eps)
localList <- c(localList , childID)
analyseRecHistSimAgg(treeID, childID, histSimVecs, eps, refDate)
}
}

return(localList)
}



Diese hangelt sich in einer Baumstruktur immer weiter nach unten und geht jeden Pfad ab. Jetzt möchte ich Portfolien suchen, die falsch berechnet wurden, wofür ich die if-Abfrage

if (sum((abs(difference - aggDifference)/abs(difference))) > 250 * eps)

habe. Falls diese wahr ist, soll er mir den Portfoiliennamen in einer Liste abspeichern.

Am Ende möchte ich dann eine Liste mit allen Portfolien, die fehlerhaft berechnet wurden.

Hier ist aber mein Problem. Da ich dieses Rekursiv berechne und er so die Berechnung des ersten Knotens als letztes beendet, bekomme ich auch immer nur eine Liste mit falsch berechneten Protfolien aus dieser "Ebene"

Ich hoffe es hat überhaupt jemand verstanden, wo mein Problem liegt ;)
Und natürlich, dass mir da jemand helfen kann!!!!

Gruss und Danke,
DUDE...

sofa-surfer
20-10-2006, 12:55
Hallo,

hab mich jetzt nicht in dein Problem reingedacht, und vielleicht versteh ich das Problem jetzt auch nicht so ganz. Aber so wie ich das sehe, solltest du doch die Liste mal global initialisieren?


function(){

x<-NULL
for (i in (1:10)){
if (i%%2==0)
x<-c(x,i)
}
x
}

Oder hast du auf der Ebene eines Knoten mehrere Elemente die du in eine localList schreibst?

Wie auch immer. Bei solchen Abarbeitungsgeschichten macht sich auch immer das lapply ganz gut .... Da werden die Ergebnisse automatisch in eine Liste geschrieben.

Matthias

Dude193
20-10-2006, 14:14
Hi..

.. mal wieder vielen Dank!!!!
Zum einen lag es nämlich genau daran, dass ich die list nicht global initialisiert habe (manchmal sieht man wirklich den Wald vor lauter Bäumen nicht..), zum anderen, da eine zuweisung gefehlt hat..

der aufruf der rekursion muss richtig nun folgendermaßen aussehen:

fListe <- analyseRecHistSimAgg(treeID, childID, histSimVecs, eps, refDate, fListe)

wobei fListe meine globale Liste ist!!!!!!!

Also... nochmal vielen Dank!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! :)