web-dev-qa-db-fra.com

Comment déclencher une actualisation des données en brillant?

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()
    })
})
12
Patrick McCarthy

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. 

7
Matthew Plourde

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 de valueFunc. Voir les détails.</ p>valueFunc 

Une fonction qui calcule la valeur sous-jacente. Voir les détails.

21
Jan Stanstrup

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.

1
Matt Anthony