2014-04-03 10 views
8

Sto creando un codice R per una simulazione Monte Carlo di uno sport professionale. Poiché le dinamiche di gioco sono molto complicate e per semplificare il processo di debug, mi piacerebbe che R inviasse una riga di testo per ogni azione che si svolge nel gioco a un "file di registro". Il file di registro sarebbe un approccio globale, commedia di descrizione del gioco di ciò che accade nella simulazione, e sarebbe simile a questa ...Come creare periodicamente l'invio di testo a un "file di registro" durante la stampa dell'output normale su console?

  • "gioco inizia"
  • POSSESSO ASSEGNATO ALLA X TEAM
  • LETTORE Y GETS BALL
  • LETTORE Y SCORES
  • fallo di LETTORE Z GUASTI
  • SOSTITUZIONE GUASTI (LETTORE W < -> LETTORE Q)
  • ...
  • "gioco termina"

non può semplicemente utilizzare la funzione sink() perché mentre la simulazione è in esecuzione, a configurare una barra di avanzamento (con la funzione setTxtProgressBar) e punteggi in tempo reale per essere stampato sulla console. Se ho usato sink(), non ho potuto vedere nessuno degli indicatori di progresso o dei punteggi sulla console R. Ha senso ciò? In altre parole, ho bisogno di inviare periodicamente del testo a un file di registro in modo cumulativo. Ecco qualche esempio di codice per darvi qualcosa su cui lavorare ...

Grazie

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**} 

risposta

6

Vedi ?cat. È possibile aprire una connessione file al file di registro e specificare che nella chiamata cat, quando non si specifica una connessione, verrà stampato sulla console.

Come dici tu, non utilizzare sink() in quanto renderà il file di registro la connessione predefinita. Piuttosto, apri una connessione con nome con file().

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

I risultati di cui sopra in un file di log con la linea "scrittura per il login" e "scrivere a consolare" stampato sulla console.

+1

questo quasi non quello che mi serve! L'unico problema è che non aggiunge testo al file di log in modo cumulativo. Cioè, ogni volta che eseguo il ciclo, cancella quel file di registro e quando il ciclo è completo, solo l'ultima riga rimane nel file di registro. C'è un modo per renderlo cumulativo? – Slyron

+0

Vedere '? Cat'. L'impostazione predefinita per 'append' è false, ma se la si imposta su true e si utilizza il nome di un file anziché una connessione, questa verrà aggiunta (ad esempio, aggiunta cumulativa). – Gregor

5

Per aprire il file di log in modalità "append":

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

bello, grazie – Slyron

2

capito, grazie a Shujaa e BigFinger. Per riassumere, ecco come si farebbe con il mio codice di esempio:

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) 
Problemi correlati