2017-08-29 5 views
0

J'ai un jeu de données réactif relativement important dérivé de l'interrogation d'un fichier puis de la lecture d'un fichier dans un intervalle prédéfini. Les données sont fréquemment mises à jour et nécessitent un rechargement constant. Certes, le rechargement pourrait être fait de manière incrémentale et ajouté à l'objet existant dans R, mais ce n'est pas le cas. Cependant, actuellement, cette action est effectuée pour chaque utilisateur de l'application brillante bien que les données soient les mêmes d'une session à l'autre. La seule façon dont je suis venu avec une solution ronde était de déterminer si la session est la première, et que cette session soit le maître pour la mise à jour des données par interrogation. Les sessions suivantes ne pas interroger à condition qu'il existe toujours un master.Partage de jeux de données réactifs entre des sessions utilisateur dans Shiny

Existe-t-il un moyen plus simple d'obtenir le même résultat sans gérer cette relation maître?

C'est presque comme un besoin d'un appel réactif à l'intérieur de la fonction globale qui fonctionne pour le compte de tous les clients/sessions.

Répondre

0

J'espère avoir compris la question. Je suppose que l'ensemble de données est identique pour toutes les sessions et toutes les connexions. Exemple: si un utilisateur met à jour l'ensemble de données, il doit également être mis à jour pour toutes les autres sessions? Si tel est le cas, je voudrais simplement lire à partir d'une base de données et écrire dans cette base de données chaque fois qu'un utilisateur le met à jour. Si vous avez une base de données MySQL, vous pouvez l'utiliser. Vous pouvez également utiliser un fichier de base de données SQLite spécifique à l'application dans votre application et vous pouvez le conserver avec vos fichiers server.r et ui.r et tous les autres fichiers spécifiques à l'application.

Vous pouvez toujours lire à partir de la base de données sur un intervalle prédéfini. De cette façon, vous ne gardez pas une copie des données dans la RAM et évitez de le charger plusieurs fois pour chaque session Shiny.

Une autre option pourrait être ceci. En outre, dans votre fichier server.r, tout ce que vous mettez dans votre fonction shinyServer() sera exécuté chaque fois qu'une session est créée (c'est-à-dire chaque fois qu'un utilisateur pointe son navigateur vers votre application). Tout ce que vous mettez en dehors de votre fonction shinyServer() (par exemple au tout début) ne sera exécuté qu'une fois lors de l'initialisation de votre application sur la commande runApp(). Donc, si vous chargez votre jeu de données une fois OUTside de votre fonction shinyServer() et l'enregistrez dans une variable d'environnement globale, il devrait être accessible par toutes les sessions. Chaque session devrait également être sauvegardée dans un environnement global.

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

+0

Toutes les bonnes suggestions. Peut-on attribuer une variable réactive globale en dehors de 'shinyServer()'? Je crois que j'ai déjà essayé cela sans succès. Je vais tester cela à nouveau. C'est presque comme si j'avais besoin d'interroger/mettre à jour l'ensemble de données en dehors de 'shinyServer()' et mettre à jour une variable réactive globale de sorte que lorsque ces données changent globalement, la vue de chaque utilisateur est mise à jour. – theGreatKatzul

+0

Vous avez raison, vous ne pouvez pas créer de variable _reactive_ en dehors de 'shinyServer()' mais vous pouvez créer une variable dans un environnement R global, accessible depuis n'importe quelle fonction et/ou boucle, ainsi que votre serveur Shiny et vos fonctions réactives . Plus sur les environnements dans R ici: https://stat.ethz.ch/R-manual/R-devel/library/base/html/environment.html Mais je voudrais d'abord essayer l'option de base de données. Pourquoi ne pas créer une base de données MySQL ou SQLite, comme je l'ai suggéré précédemment? De cette façon, l'application sera évolutive, car dataframe n'aura pas besoin de charger entièrement dans l'application et n'utilisera pas de RAM –