2014-04-03 9 views
8

Ich erstelle R-Code für eine Monte-Carlo-Simulation eines Profisports. Da die Spieldynamik sehr kompliziert ist und der Debugging-Prozess einfacher wird, möchte ich, dass R eine Textzeile für jede Aktion, die im Spiel passiert, an eine "Protokolldatei" sendet. Die Log-Datei ein umfassendes, Spiel durch Spiel Beschreibung wäre, was in der Simulation passiert, und so etwas wie dieses ...Wie erstelle ich in regelmäßigen Abständen Text an eine "Protokolldatei", während ich die normale Ausgabe an die Konsole drucke?

  • „GAME BEGINNT“
  • BESITZES ZUGEWIESEN X TEAM
  • PLAYER Y GETS aussehen würde BALL
  • PLAYER Y KERBEN
  • Foul von PLAYER Z OCCURS
  • SUBSTITUTION eintritt (PLAYER W < -> PLAYER Q)
  • ...
  • „GAME ENDS“

ich nicht nur die Waschbecken() Funktion verwenden kann, weil während der Simulation läuft, ich Setup einen Fortschrittsbalken (mit setTxtProgressBar Funktion) und Echtzeit-Scores zu sein gedruckt auf der Konsole. Wenn ich sink() verwendet habe, konnte ich keine Fortschrittsanzeigen oder Punkte auf der R-Konsole sehen. Macht das Sinn? Mit anderen Worten, ich muss regelmäßig in kumulativer Weise Text an eine Protokolldatei senden. Hier einige Beispiel-Code Sie etwas zu geben, mit zu arbeiten ...

Dank

for (i in 1:100) 
{**SOMEHOW NEED TO PRINT LINE "START LOOP" TO LOG FILE**; 
a <- rnorm(n = 100, mean = i, sd = 5); 
print(mean(a)); #PRINT THIS MEAN TO THE CONSOLE 
**SOMEHOW PRINT "LOOP 'i' COMPLETE" TO LOG FILE**} 

Antwort

6

Siehe ?cat. Sie können eine Dateiverbindung zu Ihrer Protokolldatei öffnen und angeben, dass in Ihrem -Aufruf, wenn Sie keine Verbindung angeben, diese auf der Konsole gedruckt wird.

Wie Sie sagen, verwenden Sie nicht sink(), da dies die Protokolldatei zur Standardverbindung macht. Öffnen Sie stattdessen eine benannte Verbindung mit .

> log_con <- file("test.log") 
> cat("write to log", file = log_con) 
> cat("write to console") 
write to console 

Die obigen Ergebnisse in einer Protokolldatei mit der Zeile „write loggt“ und „schreiben Konsole“ auf der Konsole ausgegeben.

+1

Dieser fast tut, was ich brauche! Das einzige Problem ist, dass es der Protokolldatei nicht kumulativ Text hinzufügt. Das heißt, bei jeder Ausführung der Schleife löscht sie diese Protokolldatei, und wenn die Schleife abgeschlossen ist, verbleibt nur die letzte Zeile in der Protokolldatei. Gibt es eine Möglichkeit, es kumulativ zu machen? – Slyron

+0

Siehe "Katze". Der Standardwert für "append" ist false, aber wenn Sie ihn auf "true" setzen und den Namen einer Datei anstelle einer Verbindung verwenden, wird sie angehängt (d. H. Kumulativ addiert). – Gregor

5

Um die Protokolldatei in "append" -Modus zu öffnen:

log_con <- file("test.log",open="a") 
+0

schön, danke – Slyron

2

figured it out, dank Shujaa und BigFinger. Um es zusammenzufassen, hier ist, wie Sie es mit meinem Beispiel-Code tun würde:

log_con <- file("/filepath/log.txt", open="a") 

for (i in 1:100) 
{ 
cat("loop begins", file = log_con, sep="\n") 
a <- rnorm(n = 100, mean = i, sd = 5) 
print(mean(a)) 
cat("single loop completed", file = log_con, sep="\n") 
} 

close(log_con) 
Verwandte Themen