R控制台能否支持后台任务或中断(事件处理)?

R控制台能否支持后台任务或中断(事件处理)?,r,event-handling,interrupt,background-process,R,Event Handling,Interrupt,Background Process,在R控制台中工作时,我想设置一个后台任务来监视特定的连接,当事件发生时,执行另一个函数(警报)。或者,我可以设置一些东西,以便外部函数只向R发送警报,但这似乎是同一个问题:有必要设置侦听器 我可以在R的专用过程中完成这项工作,但我不知道这在控制台中是否可行。另外,如果R正在计算一个函数,我对中断R不感兴趣,但如果控制台只是在等待输入,我会发出警报或中断 以下是三个用例: 最简单的例子是查看文件。假设我有一个名为“latestData.csv”的文件,我想监控它的变化;当它更改时,将执行myAle

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

我可以在R的专用过程中完成这项工作,但我不知道这在控制台中是否可行。另外,如果R正在计算一个函数,我对中断R不感兴趣,但如果控制台只是在等待输入,我会发出警报或中断

以下是三个用例:

  • 最简单的例子是查看文件。假设我有一个名为“latestData.csv”的文件,我想监控它的变化;当它更改时,将执行
    myAlert()
    。(可以扩展它来做不同的事情,但只要弹出一个文件已更改的注释就很有用了。)

  • 另一种监视器将监视给定的计算机是否在RAM不足的情况下运行,并可能执行
    save.image()
    并终止。同样,这可能是一个观察外部监视器生成的文件的简单问题,该监视器保存
    top
    或其他命令的输出

  • 另一个例子类似于另一个最近的SO问题,关于:。如果来自另一台机器或进程的警报告诉程序保存并终止,那么能够监听该警报将是非常棒的

  • 目前,我怀疑有两种处理方法:通过Rserve和可能通过
    fork
    。如果有人能举例说明如何使用包或通过其他方法实现这一点,那就太好了。我认为解决这三个用例中的任何一个都可以解决所有的问题,只需对一点外部代码进行模化


    注1:我意识到,R是单线程的,这就是为什么我怀疑
    fork
    和Rserve可能工作的原因。然而,我不确定的可行性,如果一个是与R终端接口。虽然R的REPL连接到控制台的输入,但我试图绕过它或模拟它,这可能是
    fork
    Rserve
    的答案

    注2:对于那些熟悉事件处理/事件处理方法的人来说,这也可以解决所有问题。我只是在R里找不到这方面的任何东西



    更新1:我发现编写R扩展的手册提到了使用
    R\u polleEvents
    。这看起来很有希望。

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

    后一种情况基本上是没有希望的,除非您将手动使计算代码在(甚至发生)processIt时执行

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

    一些想法:

  • 从另一种语言的脚本中运行R(例如,在Perl中,可以使用),并使用包装脚本启动侦听器

  • 另一个选项是从R中运行外部(非R)命令(使用
    system()
    ),该命令将在后台启动侦听器

  • 在启动R之前或在单独的窗口中以批处理模式在后台运行R

    例如:

    R——不保存output.out&

    事件发生时,侦听器可以发送适当的电子邮件


  • 原来包
    Rdsm
    也支持这一点

    使用这个包,可以在不同的R实例之间建立服务器/客户机关系,每个实例都是基本的R终端,服务器可以向客户机发送消息,包括函数

    转换为我描述的用例,服务器进程可以执行任何必要的监视,然后向客户端发送消息。不幸的是,文档有点简洁,但功能似乎很简单

    例如,如果服务器进程定期监视连接(文件、管道、URL等),并且遇到触发器,那么它可以向客户端发送消息

    尽管这个包的主要用途是共享内存(这是我遇到它的原因),但是这个消息在其他用途上也可以很好地工作


    更新1:当然,对于消息传递,不能忽略MPI和
    Rmpi
    包。这可能会起作用,但是
    Rdsm
    软件包可以与R控制台一起启动/工作,这正是我所寻求的那种界面。我还不确定
    Rmpi
    支持什么。

    还有一个选项是。它是非阻塞的


    下面是一个使用它的示例,它有3000多个视图。它展示了如何将R会话转换为服务器,以及如何向其发送命令和接收数据。它演示了即使在服务器繁忙时也可以这样做;e、 例如,假设您启动了一个长时间运行的流程,但忘记保存中间结果,您可以连接到服务器并从中获取结果(在它完成之前)。

    您能否澄清您的第二段?我很高兴有东西定期检查状态+1关于tcl/tk和gtk的建议。我一定会看看
    triggr
    ,看看我是否能适应它或想法。我看了
    triggr
    ,但我想我需要看看tcl/tk或gtk方法,就像你建议的那样。+1谢谢!看起来这正是我要找的。我不知道我以前是否用过它