2017-01-12 1 views
0

Ich habe ein Modell, das Daten in Form von .csv-Dateien ausgibt. Das Ausgabeverzeichnis ist voll mit .csv-Dateien, die jeweils mit n.csv benannt sind, wobei n die Laufnummer ist. Also beim 0. Lauf erzeugt es 0.csv, beim 1. Lauf erstellt es 1.csv, etc.Probleme in R mit Schließungen, die .csv-Dateien sequenziell zurückgibt

Jetzt möchte ich diese Daten in R analysieren, und es mit der Ausgabe eines anderen Modells vergleichen. Ich habe eine Funktion geschrieben, die die von mir gewünschte Analyse an zwei Modellen ausführt, die als Funktionen als Eingaben dienen. Das Modell, das ich zu bin Vergleich ist eine Build-in sna-Funktion und eine Funktion zu machen, dass mein Modell simuliert ich folgende Schließung

#creates a model function that returns sequentially numbered .csv files from a directory 
make.model <- function(dir) { 
    i <- -1 # allows for starting the .csv ennumeration at 0 
    model <- function() { 
    i <<- i + 1 
    my.data <- as.matrix(read.csv(paste0(dir, i, ".csv"), header=FALSE)) 
    return(my.data) 
    } 
    return(model) 
} 
schrieb

Das Problem, das ich in laufen lasse, ist, dass, obwohl

my.model <- make.model(directory) 
spectral.analysis(my.model, other.model, observed.data, nsim = 100) 

Genau das, was ich will und berechnet, wie gut mein Modell und das andere Modell die beobachteten Daten modellieren, es ist nicht wiederverwendbar. Der Zähler innerhalb des Closings wird permanent hochgezählt und die Funktion kann daher nur so oft ausgeführt werden, bis sie auf nicht vorhandene .csv-Dateien zugreift.

Ich bin gerade dabei, dies mit einer "Reset" -Funktion zu umgehen, die my.model neu definiert und es nach jeder Verwendung von my.model ausführt, das scheint eine sehr schlechte Lösung zu sein.

Gibt es einen klügeren Weg, dies zu tun? Entscheidend ist, dass die Funktion spectrum.analysis() Funktionen als Eingabe verwendet und dann die Funktion ausführt, um ihre Werte zu erhalten, und das Umschreiben dieser Funktion ist momentan nicht auf dem Tisch. Ich gebe die Daten nicht direkt von meinem Modell an die Analysefunktion weiter, da mein Modell Stunden benötigt, um laufen zu können. Daher möchte ich in der Lage sein, viele Versuche vorlaufen zu lassen und sie später zu analysieren.

+1

Versuchen Sie i = i + 1 anstelle von i << - – akaDrHouse

+0

@akaDrHouse Ich habe den Eindruck, dass die Verwendung von "=" für die Zuweisung von Variablen als schlecht Stil in R gilt, mit "<-" bevorzugt. In jedem Fall funktioniert das nicht. Die Verwendung von "<-" oder "=" bewirkt, dass die Funktion bei jeder Ausführung auf "0.csv" schaut, da die Inkrementierung den Bereich des aktuellen Laufs nicht überschreitet. –

+1

Die Verwendung globaler Zuordnung wird allgemein als * schlechte Praxis * betrachtet. Es ändert, wie Ihr Code läuft und wie Sie Dinge gestalten. Das '<-' vs' = 'ist eine * Stil-Präferenz *, die, mit Ausnahme von einem oder zwei extrem seltenen Fällen, nicht ändert, was Ihr Code tut, ändert nur, wie es aussieht. – Gregor

Antwort

0

Selbstantwort zu schließen, habe ich es mit Hilfe der Kommentare herausgefunden.

length(list.files(pattern=".csv")) 

Hier können Sie die Anzahl der CSV-Dateien erhalten, so dass die Linie zu ändern, wo i erhöht wird

i <<- (i + 1) %% length(list.files(pattern=".csv")) 

löst das Problem zu lesen.