R控制台可以支持后台任务或中断(事件处理)吗?

Ite*_*tor 8 r interrupt event-handling background-process

在R控制台中工作时,我想设置监视特定连接的后台任务,当事件发生时,执行另一个功能(警报).或者,我可以进行设置,以便外部函数只是向R发送警报,但这似乎是同样的问题:有必要设置一个监听器.

我可以在R的专用过程中执行此操作,但我不知道在控制台中是否可行.另外,如果它正在计算一个函数,我对中断R不感兴趣,但是如果控制台只是在等待输入,则警告或中断.

以下是三个用例:

  1. 最简单的例子是观看文件.假设我有一个名为"latestData.csv"的文件,我想监视它的变化; 当它改变时,myAlert()执行.(可以将它扩展为执行不同的操作,但只是弹出一个文件已更改的注释是有用的.)

  2. 一种不同类型的监视器将监视给定的机器是否在RAM上运行不足并且可能执行save.image()并终止.同样,这可能是一个简单的问题,即观察由外部监视器生成的文件,该文件可以保存输出top或其他命令.

  3. 一个不同的例子就像另一个最近的SO问题,关于:让R停止正在运行的EC2机器.如果来自另一台机器或进程的警报告诉程序保存并终止,那么能够监听该警报将是很好的.

目前,我怀疑有两种方法可以解决这个问题:通过Rserve和可能的via fork.如果有人有关于如何使用包或通过其他方法执行此操作的示例,那将是很好的.我认为解决这三个用例中的任何一个都可以解决所有这些问题,模拟一些外部代码.


注1:我意识到,根据另一个SO问题的答案,R是单线程的,这就是我怀疑fork和Rserve可能工作的原因.但是,如果一个人与R终端接口,我不确定可行性.虽然R的REPL附加到控制台的输入,但我试图绕过它或模仿它,这是答案的地方forkRserve可能.

注2:对于那些熟悉事件处理/事件处理方法的人来说,这也可以解决所有问题.我在R中找不到任何相关内容.


更新1:我发现编写R扩展的手册有一个引用事件处理的部分,其中提到了使用R_PolledEvents.这很有希望.

Mat*_*wle 9

另一个选项是svSocket包.它是无阻塞的.

这是一个使用它的8分钟视频,有超过3,000个视图.它显示了如何将R会话转换为服务器以及如何向其发送命令并接收数据.即使服务器忙,它也会证明这样做; 例如,假设您开始一个长时间运行的过程而忘记保存中间结果,您可以连接到服务器并从中获取结果(在它完成之前).


mbq*_*mbq 3

这取决于您是否想要中断空闲或工作的 R。如果是第一个,您可以考虑通过某个事件侦听器绕过 R 默认 REPL 循环,该事件侦听器将对传入事件进行排队并评估它们。常见的选项是使用 tcl/tk 或 gtk 循环;我在我的triggr包中围绕 libev 做了类似的事情,它使来自套接字的 R 摘要请求。

后一种情况基本上是没有希望的,除非您手动制作计算代码来if(evenOccured) processIt定期执行代码。

多线程不是一个真正的选择,因为正如您所知,一个进程中的两个解释器将通过使用相同的全局变量来破坏自身,而分叉进程将具有独立的内存内容。