Ich habe eine csv von Zeitreihendaten für eine Anzahl von Seiten, für die ich ggplots erzeuge, und zeige Änderungen in means mit dem changepoint-Paket an. Ich habe eine Funktion geschrieben, die den csv übernimmt, einige Berechnungen durchführt, um die Mittelwerte zu erhalten, und dann durch die Seiten schlingt, um für jeden einen Plot zu erzeugen. Mein Problem ist, dass ein in der for-Schleife erstelltes Objekt nicht gefunden wird.
Ein sehr vereinfachtes Beispiel ist unten, erzeugt aber denselben Fehler:
%Vor%Der Fehler, den ich bekomme, ist: "Fehler in eval (expr, envir, enclos): Objekt 'df2' nicht gefunden"
Ich bin nicht ganz sicher, was das Problem ist, da ich ähnliche Schleifen erstellt habe, die in der Vergangenheit funktioniert haben. Wenn ich i einen Wert zuweiße und den Code innerhalb der Schleife durchtrete, funktioniert es einwandfrei. Ich denke an ein Umweltproblem? Oder macht Ggsave etwas wacklig? Jede Hilfe / Zeiger dankbar erhalten. Danke.
Ihr Problem ist nicht so sehr Ihr Code, sondern die Implementierung des ggplot2-Pakets. Dieses Paket verwendet eine nicht standardmäßige Auswertung, die Ihre Ergebnisse ernsthaft beeinträchtigen kann.
Sehen Sie sich den Beispielcode am Ende dieses Posts an. Ich erstelle in der globalen Umgebung einen Datenrahmen namens df2
mit verschiedenen Werten. Wenn ich jetzt Ihren Code ausführe, erhalten Sie Diagramme, die wie folgt aussehen:
Beachten Sie, dass auf der X-Achse die korrekten Datumsangaben verwendet werden, die Werte auf der Y-Achse jedoch denen aus dem Datenrahmen df2
in der globalen Umgebung entsprechen! Also sucht die Funktion aes()
nach den Daten an zwei verschiedenen Stellen. Wenn Sie den Namen einer Variablen als Symbol angeben ( date
), sucht die Funktion zuerst im Datenrahmen, der im Funktionsaufruf angegeben ist. Ein Ausdruck wie df2[,2]
kann jedoch nicht im Datenrahmen gefunden werden, da es keine Variable mit diesem Namen gibt. Aufgrund der Art und Weise, wie das Paket ggplot2
erstellt wird, sucht R in der globalen Umgebung nach der in der aufrufenden Umgebung.
Laut Kommentar von wici : Ihre beste Option ist wahrscheinlich, die Funktion aes_string()
zu verwenden, da Sie damit die AES in Zeichenform übergeben können, und diese Funktion wertet Ausdrücke im richtigen aus Umgebung:
Alternativ können Sie das umgehen, indem Sie eval()
und parse()
wie folgt verwenden:
Wenn Sie das mit dem folgenden Beispielskript ausprobieren, werden Sie sehen, dass Sie dieses Mal die korrekten Werte erhalten. Beachten Sie, dass dies eine suboptimale Lösung ist, da die meisten Lösungen eval()
beinhalten. Ich würde für aes_string()
hier gehen.
BEISPIEL SCRIPT
%Vor%