R Shiny 的进程队列

标签 r asynchronous shiny-server shiny

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

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

目前我们的流程是这样的:

  1. 人们会将 CSV 文件及其电子邮件输入到我们 Shiny 的应用程序中。
  2. startServer 文件观察提交按钮,并调用绘图方法(在plotting.R 中),该方法将数据绘制为 PNG 格式,并返回文件名。
  3. 然后,shinyServer 将返回的文件名和电子邮件传递给邮寄方法(在 mail.R 中),该方法将数据邮寄出去。

注意:对邮件和绘图的调用未设置为“local=TRUE”,因此它们位于全局环境中。

我的想法是:

  1. 在 startServer 方法之外但仍在 server.R 中声明一个队列对象 (q),并调用 q$push(inputtedData, email)。
  2. 从那里,队列对象将调用计算并将文件邮寄给客户端,并等到每项作业完成后才继续进行下一项。

问题是我不确定如何允许队列文件接受异步调用以将新数据推送到队列结构上。由于 startServer 是一个每 session 环境,因此在实现共享队列时我必须考虑什么。

我用来引用的链接: https://gist.github.com/thesamuel/2450bbee9ef3082e21f68d37b1d40060

提前致谢,如果我遗漏了什么,请告诉我。

最佳答案

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

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

  1. 您想要根据请求或用户输入运行一些耗时的作业。
  2. 您希望在作业完成之前返回给用户。
  3. 网页中的任何内容都不依赖于作业的完成。

在你的位置,我只会以最简单的方式写入Shiny外部的队列。例如,追加到文件或向数据库添加行。然后, Shiny 的交互可以立即继续。您可以在 Shiny 之外设置一个完整的单独进程,该进程将从文件/表中读取数据,并在每次执行时发送一封电子邮件。

事实上,您很幸运能够发送电子邮件,这可以完全在 Shiny 之外完成,而不需要完全(且复杂)的异步。

关于R Shiny 的进程队列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37449892/

相关文章:

r - 如何在不添加空格的情况下将R图中的一个字母更改为斜体样式

r - 将 SQL 文件放在 R 包中的什么位置?

r - 使用聚集堆叠列并引入新的因子类型

ios - Swift:Completion Closure 永远不会执行?

r - docker化后如何获取golem应用生成日志?

r - 小数字的 Y 轴缩放问题

c# - 等待 Task.Run 与等待

r - 将信息打印到shiny-server日志中

在 Shiny 的数据表中渲染图像

c# - 简化任务 foreach 循环 c#