R流程的闪亮队列

时间:2016-05-26 00:56:07

标签: r asynchronous shiny-server shiny

我正在处理一个处理大型数据集和电子邮件结果的Shiny服务器。我们已经编写了计算和邮寄结果的代码,但我们希望实现一个排队系统来按照收到的顺序处理每个提交。

我计划使用此处描述的Queue类:http://www.r-bloggers.com/implementing-a-queue-as-a-reference-class/

目前我们的流程如下:

  1. 一个人会将CSV文件及其电子邮件输入我们闪亮的应用程序。
  2. startServer文件观察提交按钮,并调用绘图方法(在plotting.R中),该方法将数据绘制为PNG,并返回文件名。
  3. 返回的文件名和电子邮件随后由shinyServer传递给邮寄方法(在mail.R中),邮寄方法将邮寄数据。
  4. 注意:对邮件和绘图的调用未设置为" local = TRUE",因此它们位于全局环境中。

    我的想法是:

    1. 在startServer方法之外声明一个Queue对象(q)但仍在server.R中并调用q $ push(enteredData,email)。
    2. 从那里,队列对象将进行计算并将文件邮寄到客户端的调用,并等到每个作业完成后再移动到下一个作业。
    3. 问题是我不确定如何允许Queue文件接受异步调用以将新数据推送到队列结构上。看作startServer是一个每会话环境,在实现共享队列时我必须考虑什么。

      我用于参考的链接: https://gist.github.com/thesamuel/2450bbee9ef3082e21f68d37b1d40060

      提前致谢,如果我遗漏了任何内容,请告诉我。

1 个答案:

答案 0 :(得分:0)

有可能这样做。当然,有一些代码片段被设计为允许从Shiny应用程序调用异步代码。请参阅https://gist.github.com/jcheng5/9504798d93e5c50109f8bbaec5abe372 https://gist.github.com/andrewsali/3317e5954459fef2f5fed68d68c1ac92(在异步任务运行后使用被动更新闪亮输出)和https://github.com/alexbbrown/mURL(异步HTTP,专为在Shiny中使用而设计)。请注意,这些都是实验性/ PoC代码,它们可能会帮助您修补解决方案,但不太可能为您开箱即用。

但是,我建议你不要使用这种方法。您的要求如下所示:

  1. 您希望根据请求或用户输入运行耗时的作业。
  2. 您希望在作业完成之前返回给用户。
  3. 网页中的任何内容都取决于作业的完成情况。
  4. 在你的位置,我会以最简单的方式写入Shiny外部的队列。例如,附加到文件或向数据库添加行。然后可以立即继续闪亮的互动。您可以在Shiny之外设置一个完整的单独进程,该进程将从文件/表中读取,并在每次执行时发送电子邮件。

    事实上,你很幸运,你发送的电子邮件完全可以在Shiny之外完成,而不是需要完整(和复杂)的异步。