J'ai une application brillante qui interroge des données SQL dans des trames de données, qui sont ensuite référencées à partir de mon bloc shinyServer (). Je ne l’utilisais jusqu’à présent que dans RStudio, et chaque fois que j’avais besoin de nouvelles données, je ne faisais que redémarrer l’application et, avant le chargement du serveur, le système enregistrait toutes les nouvelles données.
J'aimerais passer de l'application à un serveur brillant, mais je ne sais pas comment je peux l'inciter à obtenir de nouvelles données périodiquement. Pour des raisons d’interface, j’aimerais qu’elle soit automatique plutôt que de demander à un utilisateur de cliquer sur un bouton pour lancer le chargement. Existe-t-il une solution idiomatique pour cela?
MODIFIER:
Je pense avoir trouvé une solution qui fonctionne pour moi.
shinyServer(function(input,output,session){
sourceData <- reactive({
invalidateLater(1000000,session)
functionThatGetsData()
})
})
Vous recherchez invalidateLater
. Placez ceci, avec l'intervalle approprié, dans l'expression réactive qui récupère les données de la base de données.
Le plus intelligent serait probablement d'utiliser reactivePoll
si vous pouvez effectuer une requête rapide pour détecter s'il y a de nouvelles données. Cela a très bien fonctionné pour moi aujourd'hui même.
reactivePoll shiny
Sondage réactif
La description
Utilisé pour créer une source de données réactive, qui fonctionne en interrogeant périodiquement une base de données non réactive.
Usage
reactivePoll(intervalMillis, session, checkFunc, valueFunc)
Arguments
intervalMillis
Nombre approximatif de millisecondes à attendre entre les appels à
checkFunc
. Il peut s'agir d'une valeur numérique ou d'une fonction qui renvoie une valeur numérique.session
La session utilisateur à laquelle associer ce lecteur de fichiers ou
NULL
si aucun. S'il n'est pas nul, le lecteur s'arrêtera automatiquement à la fin de la session.checkFunc
Une fonction relativement peu coûteuse dont les valeurs seront testées au fil du temps pour vérifier leur égalité; Négalité indique que la valeur sous-jacente a changé et doit être invalidée et relue à l'aide devalueFunc
. Voir les détails.</ p>valueFunc
Une fonction qui calcule la valeur sous-jacente. Voir les détails.
Je ne pense pas que l'une ou l'autre de ces réponses réponde pleinement à la question de OP. Plus précisément
chaque fois que j'avais besoin de nouvelles données, je redémarrais simplement l'application et avant que ne soit chargé, il récupérait toutes les nouvelles données.
ce qui suggère que l'objet global doit être actualisé. L'utilisation de reactives dans la fonction serveur n'est pas une bonne solution à ce problème, car vous avez une situation critique si plusieurs utilisateurs interagissent avec l'application simultanément ... tous tenteront de mettre à jour l'objet simultanément, ce qui peut ou non résoudre lui-même bien en fonction de la mise à jour (c’est quelque chose avec lequel je lutte activement).
Une solution possible que j'ai explorée consiste à utiliser le package flock pour que chaque utilisateur tente d'acquérir un verrou sur un fichier temporaire global. L'utilisateur qui acquiert ce fichier avec succès serait alors chargé d'effectuer la mise à jour globale. Cela répond directement à la situation de concurrence critique. Je ne l'ai pas suffisamment testé pour pouvoir l'afficher comme solution ici, peut-être que quelqu'un d'autre peut fonctionner avec cela.