ESS直接绘制到Emacs缓冲区吗?


33

问:如何获得ESS(R)直接绘制到Emacs缓冲区?

通过ESS与R交互时,R默认会在Emacs外部生成一个单独的图形窗口以绘制其图。(当然,一个可以选择其他图形设备,这就是我们将其绘制为PDF的方式,等等。)两个问题:首先,新窗口夺走了Emacs的关注,其次,确保所有内容都保持整洁会很好在Emacs生态系统中。

因此:有没有办法将“直接”(或什至是间接)绘制到Emacs缓冲区,更重要的是,这样做无需用户进行大量手动干预?

这个旧的Stack Overflow线程中已有一些先前的讨论,但是提出的部分解决方案并不理想。它们主要涉及更改R中的绘图设备(例如,更改为PNG),绘图到临时文件,然后在Emacs缓冲区中手动访问该文件。这一切让我感到非常笨拙,特别是如果目标是交互使用绘图窗口/缓冲区并在一个会话中绘制许多绘图(或动态添加图层)。

我在这里推测,但令我惊讶的是,由于R和Emacs都支持SVG,因此这可能是一种有用的格式。但是,我不清楚是否/如何挂接到R进程中以进行实时通信。有没有一种方法可以将R吐出的SVG代码直接放入Emacs缓冲区中,还是需要通过临时文件的中介?当R创建一个临时文件时,如何说服Emacs自动访问一个新的临时文件,或者当临时文件被新图更新/覆盖时,如何更新这样的图缓冲区?


3
Emacs不必使用文件,而可以使用字符串将图像插入缓冲区,请参阅的文档字符串create-image。但是,我无法真正使R和Emacs相互通信以实现这一目标。
wasamasa 2014年

1
在ESS邮件列表中对此进行了讨论:请参阅stat.ethz.ch/pipermail/ess-help/2013-November/009559.html
Ista

Answers:


5

不能完全回答这个问题,但是当在组织模式的babel中使用R时:

* 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

C-c C-c在组织模式下执行此操作将创建一个*my-R*具有交互ESS缓冲区的缓冲区,在example.svg文件中创建图,然后您可以单击(或按Enter键)已创建的指向文件的链接,将其打开。

组织结构模式可以内嵌图像,但是在切换此功能(使用M-x org-toggle-inline-images)或打开文件时(而不是在其中运行代码时)可以内嵌图像。

因此,这不是一个完整的解决方案。


3
您可以通过设置来自动显示图像(add-hook 'org-babel-after-execute-hook 'org-display-inline-images),但是(我认为)这并不是OP真正想要的。
Ista 2015年

0

我刚刚发布了一个答案,以旧后你指的是你的问题。正如我在此处所写,这可能对您不起作用,因为这将对您整个计算机工作流程产生巨大的影响。

但是exwm通过允许任何非emacs窗口作为emacs缓冲区,从而允许在emacs缓冲区中包含R个图,这些图由通常的emacs设置和键绑定控制。

这是一个看起来像这样的例子:

在此处输入图片说明

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.