2017-05-28 2 views
0

Ich bin auf der Suche nach einer Möglichkeit, automatisch dev.off() zu rufen, um ein Plot auf die Festplatte zu spülen, wenn jemand plot() oder ggplot() aufruft.Automatisches Aufrufen von dev.off nach Plot in R

Ist das möglich? RStudio sucht automatisch nach dem Plot, wie funktioniert das?

+0

Um den zweiten Teil zu adressieren: RStudio erstellt ein eigenes Grafikgerät vom Typ 'RStudioGD'. Wenn Sie mit der rechten Maustaste auf ein Diagramm in RStudio klicken und es "inspizieren", sehen Sie, dass das Bild eine temporäre Datei ist, die von einem hinter den Kulissen laufenden Server an RStudio (im Wesentlichen ein Browser) gesendet wird. – neilfws

Antwort

2

Bearbeiten: Fügen Sie möglichen Ansatz für ggplot hinzu.

Beachten Sie, dass die Grund die plot, insbesondere nicht automatisch dev.off() nicht nennen, ist, dass es sehr häufig ist - nach plot Aufruf - zusätzliches Material hinzuzufügen (Annotationen, ergänzende Plotten Funktionen, Titel, Legenden, etc. .) mit zusätzlichen Anrufen, bevor dev.off() aufgerufen wird, um die Ausgabe abzuschließen.

Aber, wenn Sie wirklichplot wollen die Handlung abzuschließen und verhindern jede weitere Inhalte hinzugefügt werden, können Sie es tun, indem plot neu zu definieren:

plot <- function(...) { 
    graphics::plot(...) 
    dev.off() 
} 

Beachten Sie, dass für Fenster-basierten Grafikgeräten (zB x11), wird die Handlung kurz auf dem Bildschirm blinken, bevor er verschwand, da dev.off() schließt das Fenster, aber es sollte für Dateien funktionieren:

> png("plot.png") 
> plot(1:10,runif(10)) 
null device  <-- proof that dev.off() was called 
      1 
> 

Für ggplot2, ich denke, Ihre beste Wette ist es, die print Methode zu überschreiben (so wird ein Plot normalerweise auf dem Bildschirm angezeigt). Also, wenn Sie definieren:

print.ggplot <- function(...) { 
    ggplot2:::print.ggplot(...) 
    dev.off() 
} 

dann:

> png("plot.png") 
> ggplot(mapping=aes(x=1:10,y=1:10))+geom_line() 
[[ print method is implicitly called here ]] 
> dev.off() # to prove that dev.off() was already called 
Error in dev.off() : cannel shut down device 1 (the null device) 
> 

erscheint so, wie Sie wollen zu arbeiten.

Ich benutze nicht RStudio, also bin ich mir nicht sicher, was es anders macht, aber ich nehme an, dass es die Grafikbefehle so abfängt, dass es gleichzeitig den "Plot in progress" anzeigt Die Datei wird finalisiert, anstatt die Datei tatsächlich anzuzeigen (was bei Bitmap-Grafiken erst dann möglich ist, wenn der Plot vollständig fertig ist und dev.off() aufgerufen wird).

+0

Wahrscheinlich ist es besser, der Funktion einen anderen Namen als 'plot()' zu geben, damit sie nicht unbeabsichtigt Verrücktheiten erzeugt. – Thomas

+0

Vielen Dank! Wie würdest du das für ggplot und andere Graphen lösen? Ich habe es versucht, aber es scheint einen Fehler zu verursachen. –

+0

Können Sie ein "ggplot" -Beispiel in der realen Welt angeben, wie Sie das funktionieren lassen möchten? –