我使用 ESS 是为了在使用 R 时留在 Emacs 中。每当我创建一个绘图时,一个新的弹出窗口都会出现在该图中。这个新窗口似乎是 Emacs 内部调用的 R 进程的一部分。因此,新窗口不是缓冲区列表的一部分,并且似乎位于 Emacs 环境之外。
是否可以强制由 R 创建的新窗口(包含 plot() 调用的图形或 ggplot2/lattice 中的相应函数)留在 Emacs 环境中?以便该图可用作新缓冲区。
谢谢!
哦,是的,它可以...
在 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 核心中......
不,对不起,它不能。Emacs 缓冲区是文本。图形窗口是图形设备。
但是你可以自己做。在绘图之前,甚至在会话开始时,说
pdf(file="/tmp/myplotfile.pdf")
现在情节将去那里。然后您可以在 Emacs 中打开 pdf 文件,最近的版本在 Emacs 中包含 pdf 预览(至少在我的 Linux boxen 上,不确定我是否需要额外的模式)。那将接近您的要求。
这不太可能是您正在寻找的解决方案,因为它涉及将 Emacs 变成一个窗口管理器(适用于 Linux 和 MacOS):包EXWM(Emacs X 窗口管理器)是一个功能齐全的平铺窗口管理器,可以打开所有X 窗口进入 Emacs 缓冲区。
这是一个看起来像的示例(注意右侧的 R 图形窗口,现在是 Emacs 缓冲区):
这允许您对所有 X 窗口使用 Emacs 键绑定、配置等。
试试这个:
X11() # starts a X11 graphics device
plot(c(1:10),c(1:10))
savePlot(filename = "try_save_X11.png",type = c("png"))
这并不能完全回答 OP 的问题,因为这超出了 ESS,但它仍然可能与某些相关,因为它仍然与使用 R 生成可以在 Emacs 内部查看的图形有关。
您可以使用Emacs iPython Notebook (ein) 执行此操作。您必须首先设置Jupyter,但之后它非常简单,可以使用不同的内核(R、Python、Julia 等)。下面是截图