Работая в консоли R, я хотел бы настроить фоновую задачу, которая отслеживает конкретное соединение, и когда происходит событие, выполняется другая функция (предупреждение). В качестве альтернативы я могу настроить так, чтобы внешняя функция просто отправляла предупреждение в R, но это, похоже, та же проблема: необходимо настроить прослушиватель.
Я могу сделать это в специальном процессе R, но я не знаю, возможно ли это из консоли. Кроме того, я не заинтересован в прерывании R, если он вычисляет функцию, а в предупреждении или прерывании, если консоль просто ожидает ввода.
Вот три варианта использования:
Самый простой пример — просмотр файла. Предположим, что у меня есть файл с именем «latestData.csv», и я хочу отслеживать его изменения; при его изменении выполняется
myAlert()
. (Можно расширить его, чтобы делать разные вещи, но полезно просто всплывать с примечанием о том, что файл изменился.)Монитор другого типа будет следить за тем, не хватает ли данной машине оперативной памяти, и может выполнить
save.image()
и завершить работу. Опять же, это может быть простая проблема просмотра файла, созданного внешним монитором, который сохраняет выводtop
или какой-либо другой команды.Другой пример похож на другой недавний вопрос SO: есть R остановить машину EC2, на которой он работает. Если оповещение от другого компьютера или процесса говорит программе сохранить и завершить работу, то было бы здорово иметь возможность прослушивать это оповещение.
На данный момент я подозреваю, что есть два способа справиться с этим: через Rserve и, возможно, через fork
. Если у кого-то есть примеры того, как это сделать с помощью пакета или другого метода, это было бы здорово. Я думаю, что решение любого из этих трех вариантов использования решит их все, по модулю небольшого количества внешнего кода.
Примечание 1: я понимаю, за этот ответ на другой вопрос SO что R является однопоточным, поэтому я подозреваю, что fork
и Rserve могут работать. Однако я не уверен в возможности взаимодействия с R-терминалом. Хотя REPL R привязан к вводу из консоли, я пытаюсь либо обойти это, либо сымитировать, где ответом может быть fork
или Rserve
.
Примечание 2. Для тех, кто знаком с методами обработки/обработки событий, это тоже решит все проблемы. Я просто не нашел ничего об этом в R.
Обновление 1: я обнаружил, что руководство по написанию расширений R есть раздел, посвященный обработке событий, в котором упоминается использование R_PolledEvents
. Это выглядит многообещающе.