在 R 控制台中工作时,我想设置一个后台任务来监视特定连接,并在发生事件时执行另一个函数(警报)。或者,我可以进行设置,以便外部函数仅向 R 发送警报,但这似乎是同一个问题:有必要设置一个侦听器。
我可以在 R 的专用进程中执行此操作,但我不知道这在控制台中是否可行。另外,如果 R 正在计算函数,我对中断 R 不感兴趣,但如果控制台只是等待输入,则发出警报或中断。
以下是三个用例:
最简单的例子是观看文件。假设我有一个名为“latestData.csv”的文件,并且我想监视它的更改;当它改变时,myAlert()
被执行。 (人们可以扩展它来做不同的事情,但只是弹出一个文件已更改的注释就很有用。)
另一种监视器会监视给定机器是否运行内存不足并可能执行save.image()
并终止。同样,这可能是观看由外部监视器生成的文件的简单问题,该监视器保存了输出top
或其他一些命令。
另一个例子就像最近的另一个问题,关于:让 R 停止正在运行的 EC2 机器 https://stackoverflow.com/questions/7273616/have-r-halt-the-ec2-machine-its-running-on。如果来自另一台机器或进程的警报告诉程序保存并终止,那么能够侦听该警报将会很棒。
目前,我怀疑有两种方法可以处理这个问题:通过 Rserve 和可能通过fork
。如果有人有如何使用包或通过其他方法执行此操作的示例,那就太好了。我认为解决这三个用例中的任何一个都可以解决所有这些用例,对一点外部代码进行取模。
注1:我意识到,根据另一个 SO 问题的答案 https://stackoverflow.com/questions/2689900/pass-commands-to-an-running-r-runtime/2693059#2693059R 是单线程的,这就是我怀疑的原因fork
和 Rserve 可能会起作用。但是,我不确定与 R 终端连接的可行性。虽然 R 的 REPL 附加到控制台的输入,但我试图绕过这个或模仿它,这就是fork
or Rserve
也许就是答案。
注 2:对于那些熟悉事件处理/事件方法的人来说,这也可以解决所有问题。我只是在 R 中没有找到任何关于此的信息。
更新 1:我发现编写 R 扩展的手册有一个部分引用事件处理 http://cran.r-project.org/doc/manuals/R-exts.html#Meshing-event-loops,其中提到了使用R_PolledEvents
。这看起来很有希望。
另一种选择是svSocket 包 http://cran.r-project.org/package=svSocket。它是非阻塞的。
这是一个8分钟视频 http://www.youtube.com/watch?v=rvT8XThGA8o使用它,浏览量超过 3,000 次。它展示了如何将 R 会话转变为服务器以及如何向其发送命令并接收返回的数据。它演示了即使服务器繁忙时也可以这样做;例如,假设您启动了一个长时间运行的进程并忘记保存中间结果,您可以连接到服务器并从中获取结果(在完成之前)。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)