2009-09-15 1 views
8

Мне было интересно, если бы кто-нибудь знал о хорошем способе заставить R или ESS прекратить выполнение остальной части кода за пределами точки, в которой возникает ошибка, если я оцениваю регион или буфер (I «В архивах справки вы нашли обратную просьбу). Я искал в файлах справки R, но option(error=stop) остановит выполнение функции или заявления о нарушении, но не те, которые следуют за ним. Благодаря!Сила остановки или остановки при ошибке

ответ

2

? Break

Только вы выходите из цепи.

? Попробовать

Позволяет настроить код, который может потерпеть неудачу и изящно восстановиться.

+0

Спасибо, но при работе в интерактивном режиме, я не хочу, чтобы обернуть строку или область в попытке() или tryCatch() каждый раз, но я полагаю, что это технически это сделало бы ... – hatmatrix

+0

Привет crippledlambda. Вы нашли решение для своей проблемы в то же время? – giordano

4

According to the ESS manual, это должно работать: C-c C-c (Comint-прерывание-подзадание) Посылает Control-C сигнал процессу ESS. Это приводит к отмене текущей команды.

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) 

Вы можете проверить остальную часть его файл конфигурации и документации посмотрите, интересует ли он вас. Я еще не пробовал, но надеюсь, что это сработает для вас!

Чарли

+0

Спасибо Charlie - Я знаком с Cc Cc, но это для ручного останавливая процесс в процессе, независимо от ошибок (как я понимаю). Я могу изучить модификацию eval-region или eval-buffer для вызова этой функции при возникновении ошибки ... – hatmatrix

11

Если R/ESS коробления так много времени вычислений, что ваши Emacs/ESS не реагирует на C-C C-C, вы можете сохранить его, посылая сигнал прерывания от терминала.

Во-первых: вычислить R-идентификатор процесса с использованием top или ps. (У меня было 98490 Тогда: kill -2 98490 Это посылает сигнал прерывания, и вы получите ваш ESS/Emacs и R сеанс назад