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