Есть ли простой способ вызвать сбой в R? Это только для целей тестирования, чтобы увидеть, как определенная программа, использующая R в фоновом режиме, реагирует на сбой и помогает определить, вызваны ли какие-то редкие проблемы сбоями или нет.
Как свернуть R?
Ответ 1
Самый простой способ - вызвать C -code. C предоставляет стандартную функцию abort()  [1], который делает то, что вы хотите. Вам нужно позвонить: .Call("abort").
Как заметил @Phillip, вам может потребоваться загрузить libc через:
-  
в Linux,
dyn.load("/lib/x86_64-linux-gnu/libc.so.6")перед выпуском.Call("abort"). Конечно, путь может варьироваться в зависимости от вашей системы. -  
в OS X,
dyn.load("/usr/lib/libc.dylib") -  
в Windows (я только что протестировал его на XP, так как не смог получить более новую версию). Вам нужно будет установить
Rtools[2]. После этого вы должны загрузитьdyn.load("C:/.../Rtools/bin/cygwin1.dll"). 
Ответ 2
Существует целый пакет на GitHub, посвященный этому:
авария
R, которые преднамеренно вызывают R-сеанс. ПРЕДУПРЕЖДЕНИЕ: для теста.
Как установить пакет из github рассматривается в других вопросах.
Ответ 3
Я собираюсь украсть идею у @Spacedman, но я даю ему полный концептуальный кредит, скопировав из своего канала Twitter:
Segfault #rstats за один простой шаг:
options(device=function(){});plot(1)сообщила о Danger, приведет к сбою вашей сессии R. — Барри Роулингсон (@geospacedman) 16 июля 2014 года
Ответ 4
Как упоминалось в комментарии к вашему вопросу, минимальный подход - это простой вызов системной функции abort(). Один из способов сделать это в одной строке -
R> Rcpp::cppFunction('int crashMe(int ignored) { ::abort(); }'); 
R> crashMe(123)
Aborted (core dumped)
$ 
или вы можете использовать встроенный пакет:
R> library(inline)
R> crashMe <- cfunction(body="::abort();")
R> crashMe()
Aborted (core dumped)
$ 
Конечно, вы также можете сделать это за пределами Rcpp или встроенного, но тогда вам нужно иметь дело с зависящими от системы способами компиляции, связывания и загрузки.
Ответ 5
Я сделаю это на простом C, потому что мой С++ - foo не Dirkian:
Создайте файл C, segv.c:
#include <signal.h>
void crashme(){raise(SIGSEGV);}
Скомпилируйте его в командной строке (пользователям Windows придется самому это решить):
R CMD SHLIB segv.c
В R загрузите и запустите:
dyn.load("segv.so") # or possibly .dll for Windows users
.C("crashme")
Создание segfault:
> .C("crashme")
 *** caught segfault ***
address 0x1d9e, cause 'unknown'
Traceback:
 1: .C("crashme")
Possible actions:
1: abort (with core dump, if enabled)
2: normal R exit
3: exit R without saving workspace
4: exit R saving workspace
Selection: 1
aborting ...
Segmentation fault
Это то же поведение, что и то, что Томас ссылается на отчет об ошибках в графической системе, который я подал, и может быть исправлен в один прекрасный день. Однако этот двухстрочный лайнер всегда будет поднимать segfault...
Может быть, Dirk может использовать однострочный Rcpp-ise?