2017-08-29 36 views
0

我有一个相当大的反应数据集,它是通过轮询文件,然后在预定义时间间隔内读取该文件而得到的。数据经常更新并需要不断重新加载。无可否认,重新加载可以逐步完成并附加到R中的现有对象,但不是。不过目前,这个动作是针对闪亮应用的每个用户完成的,尽管数据在会话中是相同的。在Shiny中共享用户会话之间的反应数据集

我想出了一个有关解决方案的唯一方法是确定会话是否是第一个,并让该会话成为通过轮询更新数据的主数据。如果仍然存在master,则后续会话不进行投票。

有没有更简单的方法来完成相同的结果,而无需处理这种主关系?

这几乎就像是需要一个全局函数内部的被动调用来代表所有客户/会话。

回答

0

我希望我能理解这个问题。我假设数据集对于所有会话和所有连接都是相同的。 I.e .:如果一个用户更新数据集,那么它应该为所有其他会话更新?如果是这样的话,我只需简单地从数据库读取数据,并在每次用户更新数据库时写入该数据库。如果你有一个MySQL数据库,你可以使用它。或者,您可以在应用程序中使用特定于应用程序的SQLite数据库文件,并且可以将它与您的server.rui.r文件以及所有其他特定于应用程序的文件放在一起。

您仍然可以按照预定义的时间间隔从数据库读取数据。这样您就不会在RAM中保留数据副本,并避免为每个Shiny会话多次加载它。

另一种选择可能是这样的。 此外,在您的server.r文件中,每次创建会话(即每次用户将其浏览器指向您的应用程序时),您放入您的shinyServer()函数的任何内容都会运行。任何你放在你的shinyServer()函数(例如最初)的函数只会在runApp()命令初始化你的应用程序时运行一次。因此,如果您将数据集一次加载到shinyServer()函数的外侧并将其保存到全局环境变量中,那么它应该可供所有会话访问。每个会话都需要重新保存到全球环境中。

assign("main_df", df, envir = .GlobalEnv)

+0

所有的好建议。能否在'shinyServer()'之外分配一个全局反应变量?我相信我曾尝试过,但没有成功。我会再次测试。这几乎就像我需要在'shinyServer()'外面查询/更新数据集并更新一个全局反应变量,因此当全局数据发生变化时,每个用户的视图都会更新。 – theGreatKatzul

+0

你是对的,你不能在'shinyServer()'之外创建一个_reactive_变量,但你可以在全局R环境中创建一个变量,这个变量可以从任何函数和/或循环访问,也可以在你的Shiny服务器和反应函数。更多关于R的环境在这里:https://stat.ethz.ch/R-manual/R-devel/library/base/html/environment.html但我会先尝试数据库选项。为什么不按照我以前的建议创建一个数据库MySQL或SQLite?这样,应用程序将具有可扩展性,因为数据帧不需要完全加载到应用程序中,也不会使用RAM –