如何在ESS/Emacs中将R进程移至后台?

28

我经常在启动我的 R 环境时运行长时间的 R 脚本。我希望能够在 Emacs / ESS 中加载/运行 R 脚本并继续在另一个缓冲区进行其他工作。

当我按下 C-g 或 C-c C-c 键时,进程被中断,我必须重新启动脚本。

什么是在 ESS / Emacs 中后台运行 R 进程的最佳方法?

编辑:感谢您的答案和评论,但它们都没有解决 Emacs 加载/运行大型脚本时会冻结,并且您无法更改缓冲区的事实。

我想我的问题更加普遍-是否可以在 Emacs 后台运行进程以让您继续工作?


使用 C-c C-l 执行脚本。 - Eduardo Leoni
3个回答

20

ESS 将 R 作为异步进程运行。你不需要将任何内容置于后台。你可以运行几个小时的代码,而仍然可以在 ESS 中无中断地工作。

你的问题似乎是其他问题。当你执行脚本时,它会以“可视”的方式执行,即你执行的代码会被打印到终端上。这会导致 Emacs 崩溃。

ess-eval-visibly 设置为 nil,大量的代码将被立即发送到 R 中:

(setq ess-eval-visibly nil)

干杯。

更新

在最近的 ESS 版本中有一个新的设置 ess-eval-visibly - 'nowait。它将您的代码放在较低的缓冲区中,然后将其发送到子进程。这样,您可以在不等待子进程完成的情况下看到您的代码和所有输出。


如果你进入了一个不同的ess环境,无法或不想评估和emacs lisp,你可以通过确保你的函数将其结果分配给一个变量来实现相同的结果。而不是使用 long.running(),使用 res <- long.running() - Wilduck
小更新:从 ESS 版本 12.09-1 开始,ess-eval-visibly-p 已被弃用。应该使用 ess-eval-visibly。请参阅:http://ess.r-project.org/Manual/ess.html。 - Vince

3

M-x R将启动一个R会话(默认缓冲区名称为*R*)。如果再次按下M-x R,将启动第二个R会话(缓冲区名称为*R:2*)。

每个会话都有自己的R进程,因此您可以在其中一个中运行长时间的R脚本,并仍可独立使用另一个。

按下C-x C-b将显示缓冲区列表,这将允许您在R会话之间切换。

或者,如果您放置了

(global-set-key "\C-cr" 'ess-request-a-process)

在你的.emacs初始化文件中,每次按下C-c r时,您将被提示选择要切换到哪个R会话(缓冲区)。如果您只有一个会话,则会自动切换到那里。

已经存在一个 ess-request-a-process C-c C-k 的绑定,但是由于某种特殊且完全不知道的原因,它默认为 "S",即使你将 R 设置为默认值。 - aL3xa

-3
在我的个人经验中,ESS 在处理非常大的脚本方面并不是很好,有时候 Emacs 的其他部分会变得无法使用。也许你最好在 ESS 中进行开发,然后在 BATCH 模式下运行完整的脚本。

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