当我启动我的 R 环境时,我经常运行很长的 R 脚本。我希望能够在 Emacs / ESS 中加载/运行 R 脚本,并在另一个缓冲区中继续其他工作。
当我按 Cg 或 Cc Cc 时,进程被中断,我必须重新启动脚本。
在 ESS / Emacs 中后台处理 R 进程的最佳方法是什么?
编辑:感谢您的回答和评论,但它们都没有解决当您加载/运行大型脚本并且您无法更改缓冲区时 Emacs 冻结的事实。
我想我的问题更笼统一些 - Emacs 可以后台进程让您继续工作吗?
ESS 将 R 作为异步进程运行。你不需要背景任何东西。您可以运行您的代码几个小时,并且仍然可以不间断地在 ESS 中工作。
你的问题似乎是别的。当您执行您的脚本时,您会“明显地”执行它,即您执行的代码被打印到终端。这会导致 Emacs 冻结。
设置ess-eval-visibly
为 nil,大量代码将立即发送到 R:
(setq ess-eval-visibly nil)
干杯。
[更新]
在最新版本的 ESS 中有一个新设置ess-eval-visibply
- 'nowait. 它将您的代码放在一个劣质缓冲区中,然后将其发送到子进程。通过这种方式,您可以看到您的代码和之后的所有输出,而无需等待子流程完成。
[/更新]
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 不太擅长处理非常大的脚本,因为有时 Emacs 的其余部分变得无法使用。也许您最好在 ESS 中进行开发,然后在 BATCH 模式下运行完整的脚本。