R和Emacs中的弹出窗口

9
我正在使用ESS来在Emacs中处理R语言。每当我创建一个图形时,都会弹出一个新的窗口显示该图形。这个新窗口似乎是在Emacs内部调用R进程时产生的。因此,这个新窗口不属于缓冲区列表,并且似乎处于Emacs环境之外。
是否有办法让R创建的新窗口(例如通过plot()或ggplot2/lattice中的相关函数创建的图形)保持在Emacs环境内?这样,绘图就可以作为一个新的缓冲区使用。
谢谢!
5个回答

9

当然可以...

在ESS中,按照以下步骤进行:

png(file="tmp.png")
plot(1:10)
dev.off()
# [[tmp.png]]

没有内容。现在执行ESC X iimage-mode(是的,在这里有两个i)。

这将使您的缓冲区进入iimage次要模式,它应该能够检测到[[tmp.png]]并在其中加载您的图像。这应该很容易自动化。这是我第一次自己发现这个方法,所以可能有更好的方法。

显然,ESS列表上有一些关于此事的讨论:

https://stat.ethz.ch/pipermail/ess-help/2009-August/005474.html

但我很惊讶它还没有成为ESS核心的一部分...


1
这更或多或少与我的早期答案相同,不是OP所问的。他想要将emacs缓冲区作为本地R图形设备。你必须编写代码来实现这个功能。 - Dirk Eddelbuettel
嗯,啊是的,作为一个新的缓冲区...不幸的是,我认为目前无法在纯R中编写图形驱动程序,这将使得操作变得更加容易... - Spacedman
http://www.omegahat.org/RGraphicsDevice/overview.html 今天我好像充满了错误... - Spacedman

3
抱歉,它不能。Emacs缓冲区是文本,而图形窗口是图形设备。
但您可以自己做到这一点。在绘图之前,甚至在会话开始时,可以执行以下操作:
pdf(file="/tmp/myplotfile.pdf")

现在图表将会放置在那里。你可以在Emacs中打开pdf文件,最新版本的Emacs包括一个pdf预览功能(至少在我的Linux系统上是这样的,不确定是否需要额外的模式)。这将接近您的要求。


好的,那是个不错的想法。但是这样我每次调用绘图函数时都必须调用 'dev.off()' 并在创建新图或更新旧图之前启动一个新的 'pdf()' 函数。 - mropa
您可以将多个图形添加到同一文件中,参见help(pdf)onefile选项。但是您可能需要调用dev.off()来同步/刷新文件缓冲区。但这可能是您必须为某种不太常见的使用模式付出的代价。 - Dirk Eddelbuettel
我在Emacs中使用DocView模式加载pdf文件。自动更新不太顺畅,所以当我调用'plot()'两次时,pdf缓冲区会显示错误。只有在调用'dev.off'后,缓冲区才会得到更新,我才能看到这两个图。嗯...好吧,那我想我还是使用通常的设置。但是感谢Dirk提供的信息。 - mropa
你也可以使用png(...),这样Emacs就不必使用Ghostscript将PDF转换为PNG。不幸的是,auto-revert-mode似乎根本无法正常工作,但是普通的M-x revert-buffer可以。 - Nicholas Riley

2
这并不完全回答了OP的问题,因为它超出了ESS的范围,但对于一些人仍然可能相关,因为它仍然涉及使用R生成图形,可以在Emacs中查看。
您可以使用 Emacs iPython Notebook(ein)来实现这一点。您必须首先设置 Jupyter,但之后它非常简单,并且可以与不同的内核(R、Python、Julia等)一起使用。下面是一个屏幕截图。

Screenshot of R plot in ein


2

这可能不是您想要的解决方案,因为它涉及将Emacs转换为窗口管理器(适用于Linux和MacOS):包EXWM(Emacs X Window Manager)是一个功能齐全的平铺式窗口管理器,将所有 X 窗口转换为Emacs缓冲区。

以下是示例(请注意,右侧的R Graphics窗口现在是Emacs缓冲区):

enter image description here

这允许您使用Emacs键绑定、配置等来处理所有X窗口。


这很棒。您能否提供更多有关在安装exwm后如何设置其正常工作的详细信息? - Stefan Avey

1

试试这个:

X11()   #  starts a X11 graphics device
plot(c(1:10),c(1:10))
savePlot(filename = "try_save_X11.png",type = c("png"))

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接