强制停止或错误时停止

10

我想知道是否有好的方法可以让R或ESS在评估区域或缓冲区时,在出现错误的地方停止执行代码的其余部分(我只在帮助档案中找到了相反的请求)。我在R帮助文件中查找,但是option(error=stop)只会停止有问题的函数或语句的执行,而不是后续的语句。谢谢!

3个回答

12

如果 R/ESS 占用了大量的计算时间,导致您的 emacs/ESS 对 C-c C-c 命令无响应,您也可以通过从终端发送 INTERRUPT 信号来解决。

首先:使用 topps 找出 R 的进程 ID。(我的是 98490) 然后: kill -2 98490 这将发送一个中断信号,您将恢复 ESS/Emacs 和 R 会话。


5

根据 ESS 手册, 应该可以这样操作: C-c C-c (comint-interrupt-subjob) 向 ESS 进程发送一个 Control-C 信号,这将中止当前正在运行的命令。

John Fox 在其网站上提供了 ESS 的配置。其中,他有这个函数:

(defun stop-R ()

"Interrupt R process in lower window."

(interactive)

(select-window win2)

(comint-interrupt-subjob)

(select-window win1))

您应该能够使用以下方法将此功能添加到XEmacs菜单中:

(defun R-menu ()

  "Hook to install R menu and sub-menus"

  (add-menu-item '("ESS" "R") "Interrupt computation" 'stop-R
)
)
(add-hook 'ess-mode-hook 'R-menu)

你可以查看他的配置文件和文档,看看是否感兴趣。我还没有尝试过这个,但希望它对你有用!Charlie

谢谢Charlie - 我熟悉C-c C-c,但这是用于手动停止正在进行的进程,无论是否出现错误(据我所知)。当发生错误时,我可能会考虑修改eval-region或eval-buffer来调用此函数... - hatmatrix

2

?break

只能让你跳出循环。

?try

允许你编写可能会失败并且能够优雅地恢复的代码块。


谢谢,但当进行交互式工作时,我不想每次都用try()或tryCatch()包装行或区域,但我想这在技术上应该可以实现... - hatmatrix
嗨,crippledlambda。你在这段时间里找到解决问题的方法了吗? - giordano

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