ESS-Plot direkt in einen Emacs-Puffer?

33

F: Wie kann ich ESS (R) dazu bringen, direkt in einen Emacs-Puffer zu zeichnen?

Bei der Interaktion mit R über ESS wird standardmäßig ein separates Grafikfenster außerhalb von Emacs geöffnet, um die Diagramme zu zeichnen. (Natürlich kann man auch andere Grafikgeräte auswählen. So zeichnen wir in PDF usw.) Zwei Probleme: Erstens stiehlt das neue Fenster Emacs den Fokus, und zweitens wäre es sicher schön, alles schön und aufgeräumt zu halten innerhalb des Emacs-Ökosystems.

Also: Gibt es eine Möglichkeit, "direkt" (oder sogar indirekt) in einen Emacs-Puffer zu zeichnen, und dies, was noch wichtiger ist, ohne viel manuelles Eingreifen des Benutzers?

In diesem alten Stapelüberlauf-Thread gab es einige vorherige Diskussionen , aber die vorgeschlagenen Teillösungen sind nicht ideal. Meistens müssen Sie das Zeichengerät in R (z. B. in PNG) ändern, in eine temporäre Datei plotten und diese Datei dann manuell in einem Emacs-Puffer aufrufen. Das alles erscheint mir sehr klobig, insbesondere wenn das Ziel darin besteht, das Plotfenster / den Puffer interaktiv zu verwenden und viele Plots in einer Sitzung zu zeichnen (oder ihnen im laufenden Betrieb Layer hinzuzufügen).

Ich spekuliere hier, aber es fällt mir auf, dass dies ein nützliches Format sein könnte, da sowohl R als auch Emacs SVG unterstützen. Mir ist jedoch nicht klar, ob / wie man sich in den R-Prozess einbinden könnte, um on the fly zu kommunizieren. Gibt es eine Möglichkeit, R SVG-Code direkt in einen Emacs-Puffer zu spucken, oder muss eine temporäre Datei dazwischengeschaltet werden? Wie kann man Emacs überzeugen, eine neue temporäre Datei automatisch zu besuchen, wenn R sie erstellt, oder einen solchen Plotpuffer zu aktualisieren, wenn die temporäre Datei durch einen neuen Plot aktualisiert / überschrieben wird?

Dan
quelle
3
Emacs muss keine Datei verwenden und kann stattdessen einen String verwenden, um ein Bild in einen Puffer einzufügen create-image. Ich kann Ihnen jedoch nicht helfen, R und Emacs dazu zu bringen, miteinander zu kommunizieren, um dies zu erreichen.
Wasamasa
1
Dies wurde auf der ESS-Mailingliste besprochen: siehe stat.ethz.ch/pipermail/ess-help/2013-November/009559.html
Ista

Antworten:

5

Keine vollständige Antwort auf die Frage, aber wenn man R in org-mode's babel benutzt:

* My example
#+name: simple-org-example
#+begin_src R :session *my-R* :dir "." :results output graphics :file example.svg :width 18 :height 9
  plot(cyl~mpg,data=mtcars)
#+end_src

Wenn Sie C-c C-cdies im org-Modus tun, wird ein *my-R*Puffer mit einem interagierenden ESS-Puffer erstellt, die Zeichnung in der example.svgDatei erstellt und Sie können auf den erstellten Link zur Datei klicken (oder die Eingabetaste drücken), um diese zu öffnen.

Der Org-Modus kann Bilder einbinden, dies geschieht jedoch beim Umschalten dieser Funktion (mit M-x org-toggle-inline-images) oder beim Öffnen der Datei, jedoch nicht beim Ausführen eines Codes.

Das ist also keine vollständige Lösung.

Rémi
quelle
3
Sie können das Bild durch Einstellen automatisch anzeigen lassen (add-hook 'org-babel-after-execute-hook 'org-display-inline-images), aber dies ist (glaube ich) immer noch nicht wirklich das, was das OP wollte.
Ista
0

Ich habe gerade eine Antwort auf den alten Beitrag gepostet , auf den Sie in Ihrer Frage verweisen. Wie ich dort schrieb, funktioniert dies möglicherweise nicht für Sie, da es eine ziemlich dramatische Änderung in Ihrem gesamten Computer-Workflow bedeuten würde.

Aber exwm , indem jeder nicht-Emacs - Fenster ein Emacs - Puffer sein, erlaubt R Plots in Emacs - Puffer zu haben , die von den üblichen Emacs Einstellungen und keybindings gesteuert werden.

Hier ist ein Beispiel, wie das aussieht:

Bildbeschreibung hier eingeben

prosoitos
quelle