在Shiny中共享用户会话之间的响应数据集

时间:2017-08-29 14:17:09

标签: r shiny global-variables polling bigdata

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

我提出一个解决方案的唯一方法是确定会话是否是第一个,并让该会话成为通过轮询更新数据的主人。如果仍有master

,则后续会议不会进行投票

是否有更简单的方法可以在不处理此主关系的情况下完成相同的结果?

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

1 个答案:

答案 0 :(得分:2)

我希望我理解这个问题。我假设所有会话和所有连接的数据集都相同。即:如果一个用户更新了数据集,那么它也应该针对所有其他会话进行更新?如果是这种情况,我只需从数据库中读取并在每次用户更新时写入该数据库。如果您有MySQL数据库,则可以使用它。或者,您可以在应用程序中使用特定于应用程序的SQLite数据库文件,并将其与server.rui.r文件以及所有其他特定于应用程序的文件保持在一起。

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

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

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