【问题标题】:R Shiny Queue of ProcessesR闪亮的进程队列
【发布时间】:2016-05-26 00:56:07
【问题描述】:

我正在开发一个处理大型数据集和电子邮件结果的 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 中)。

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

我的想法是:

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

问题是我不确定如何让队列文件接受异步调用以将新数据推送到队列结构中。看到 startServer 是一个每个会话的环境,我在实现共享队列时必须考虑什么。

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

提前致谢,如有遗漏请告诉我。

【问题讨论】:

标签: r asynchronous shiny-server shiny


【解决方案1】:

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

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

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-06-08
    • 1970-01-01
    • 1970-01-01
    • 2016-01-02
    • 1970-01-01
    • 2014-10-02
    • 2017-04-04
    • 2021-01-09
    相关资源
    最近更新 更多