2013-09-10 7 views
22

Ich weiß, dass die sink() Funktion verwendet werden kann, um R-Ausgabe in eine Datei z.Sink nicht Datei

sink('sink-closing.txt') 
cat('Hello world!') 
sink() 

Gibt es einen einfachen Befehl, um alle ausstehenden Senken zu schließen?

Im Folgenden erkläre ich auf meine Frage.

Angenommen, mein R-Skript öffnet eine sink() in einem R-Skript, aber es gibt einen Fehler im R-Skript, der auftritt, bevor das Skript die sink() schließt. Ich kann das R-Skript mehrmals ausführen, um den Fehler zu beheben. Zum Schluss möchte ich alle Senken schließen und auf die Konsole drucken. Wie mache ich das?

Schließlich, im Interesse der Konkretheit, biete ich eine MWE, um das Problem zu veranschaulichen, dem ich gegenüberstehe.

Zuerst schreibe ich ein R-Skript sink-closing.R, das einen Fehler enthält.

sink('sink-closing.txt') 

foo <- function() { 
    cat(sprintf('Hello world! My name is %s\n', 
       a.variable.that.does.not.exist)) 
} 

foo() 

sink() 

Als nächstes I source die R-Skript mehrmals, etwa 3-mal versehentlich als ich versuche, den Fehler zu finden und zu beheben.

Nehmen wir nun an, dass ich das R-Skript debuggen und auf der Konsole drucken möchte. Ich kann sink() mehrere Male anrufen, um die früheren Senken zu schließen. Wenn ich es dreimal anrufe, kann ich endlich wie vorher auf die Konsole drucken. Aber woher weiß ich, wie viele Waschbecken ich schließen muss?

+1

Können Sie 'sink.number' verwenden? – mnel

Antwort

28

Sie können sink.number() verwenden, um Ihnen zu sagen, wie viele Umleitungen bereits eingestellt sind, und dann oft sink anrufen.

sink.reset <- function(){ 
    for(i in seq_len(sink.number())){ 
     sink(NULL) 
    } 
} 
+1

Noch ein WIN zum Lesen * aller * Dokumentation in der Hilfedatei! :-) –

9

Basierend auf @ MNEL Kommentar setzen es in eine Funktion könnten Sie dies haben:

sinkall <- function() { 
    i <- sink.number() 
    while (i > 0) { 
    sink() 
    i <- i - 1 
    } 
} 

Sollten alle offenen Waschbecken schließen.

Dieses Problem kann auch bei Geräten und Plots auftreten, bei denen die Anzahl der geöffneten Geräte nicht gemeldet wird. Für einen allgemeineren Fall könnten Sie verwenden:

stopWhenError <- function(FUN) { 
    tryCatch({ 
    while(TRUE) { 
     FUN() 
    } 
    }, warning = function(w) { 
    print("All finished!") 
    }, error = function(e) { 
    print("All finished!") 
    }) 
} 

stopWhenError(sink) # for sink. 
stopWhenError(dev.off) # close all open plotting devices. 

EDIT: sink wirft eine Warnung nicht ein Fehler, damit ich den Code geändert haben, so dass es nicht ewig laufen, hoppla!

+0

Der Vorschlag, 'tryCatch' zu verwenden, ist ein guter Vorschlag. –

23
closeAllConnections() # ......................... 
+4

... jetzt, warum sollten sie nicht darauf verweisen oder es in der Spüle-Hilfe-Datei erwähnen? – Dason

+0

Sie haben die Tatsache, dass es eine Art Verbindung war, nicht gerade verdeckt. Und es gibt einen Link zur Seite 'connection'. Es endete also mit einem Two-Hop-Link zu "? ShowConnections". –

+7

@Dason - Wahrscheinlich, weil 'closeAllConnections' ein ziemlich grobes Werkzeug ist, das für diesen Zweck verwendet wird, da es alle anderen offenen Verbindungen schließt - nicht nur die derzeit offenen 'Senken'. –