2016-12-24 1 views
3

Je souhaite créer une application R Shiny capable de transmettre des informations d'une instance en cours à d'autres instances en cours d'exécution. Je n'ai jusqu'ici rien trouvé qui pourrait m'aider avec ceci, et j'espère faire bien au lieu de recourir à des variables globales et/ou écrire aux dossiers etc. (j'ai employé la variable globale dans mon exemple ci-dessous, que je sais est un mauvaise pratique, et je suppose que l'écriture dans des fichiers ne serait pas une bonne pratique non plus).Interactivité entre plusieurs sessions d'une même application R Shiny

Ainsi, par exemple, supposons que j'ai mon App.R en cours d'exécution sur un serveur et Tim, Jack et John ont ouvert. Comment faire Tim voir ci-dessous, quand Jack et John utilisent également l'application simultanément et appuyez sur le bouton comme indiqué dans l'exemple ci-dessous?

App.R:

library(shiny) 

# Somehow interactively visible variable? (I know global variables are bad, I wouldn't want to use such) 
txt <<- "" 

shinyApp(
    ui = fluidPage(
     textInput("name", "User name", value="USERNAME"), 
     actionButton("button", "Button"), 
     htmlOutput("text") 
    ), 
    server = function(input, output, session){ 
     a <- eventReactive(input$button, { 
      txt <<- paste(txt, "Button pressed by", input$name, "at", Sys.time(), "<br>") 
      txt 

     }) 
     output$text <- reactive({ 
      HTML(a()) 
     }) 
    } 
) 

Exemple sortie désirée après plusieurs pressions de bouton des utilisateurs respectifs qui ont tous une instance d'application en cours d'exécution dans leurs navigateurs (tous avaient entrée nom unique de $ sélectionnée, mais évidemment un unique, ID de session serait mieux):

Example user case

Toute idée serait grandement appréciée, merci!

+1

Je ne pense pas que vous pouvez avoir des sessions interagir avec eachildren autre, mais j'ai construit quelques applications qui écrivent des événements dans une base de données. Certaines actions dans l'application vont rappeler les requêtes et tirer toutes les nouvelles modifications apportées par d'autres utilisateurs simultanés. – Benjamin

+0

Cela semble être une solution possible, même si j'espérais qu'il y aurait un moyen d'interagir directement.Je suppose que je pourrais avoir à construire une solution basée sur SQL aussi bien pour transmettre l'information, c'est certainement une façon de le faire même si elle dépasse R Shiny. Besoin de réfléchir, merci! –

Répondre

3

J'ai testé votre code sur une instance de serveur brillante et cela fonctionne comme prévu: c'est-à-dire que je reçois une impression similaire à celle que vous demandez.

Je suis un peu confus re: que recherchez-vous exactement?

Quoi qu'il en soit, comme un commentaire général, je suis en désaccord que l'utilisation <<- est faux ou que global variables (en général ou dans une application brillante) sont mauvais. Ils ont leur place et, en effet, un cas d'utilisation typique consiste à transmettre des états à travers des sessions/utilisateurs.

Une alternative est d'utiliser shinyreactiveValues comme dans:

values <- reactiveValues() 
values$lognames <- '' 
... 
ui <- (...) 

server <- function(input, output, session){ 

a <- eventReactive(input$button, { 
values$lognames <- paste(values$lognames, "Button pressed by", input$name, "at", Sys.time(), "<br>") 
values$lognames 
}) 
... 
} 

Mais comme une note générale de prudence, ce type de conception, bien que possible, peut finalement apporter statefulness à l'application, augmente rapidement sa complexité et genre d'aller contre la simplicité du paradigme reactive.

Ma forte recommandation est de réfléchir sérieusement avant chaque étape sur cette route. J'ai eu l'expérience de l'application des applications brillantes qui ont rapidement augmenté en complexité avec la prolifération de ces states. Je devais suivre tous les changements d'états menant à des applications cassantes et difficiles à déboguer.

+0

Bonjour, merci - le code fonctionne mais le problème était, que chacun de ces messages aurait dû être envoyé par une entité en cours d'exécution séparée de l'application R Shiny. Disons que "Tim" vivrait dans un autre pays et son nom d'entrée $ est juste indiqué comme ci-dessus, et il lance son application. Ensuite, quelqu'un d'autre sous le nom "John" utilise l'application simultanément (par exemple depuis un autre pays), et je veux être capable d'envoyer des informations entre ces sessions séparées; Par exemple, disons par exemple que je veux construire une salle de discussion en temps réel pour plusieurs personnes utilisant R Shiny en passant leurs messages texte. –

+1

Jeff Allen, employé de RStudio et développeur de serveur brillant a un exemple de salon de discussion ici: https://github.com/trestletech/ShinyChat/blob/master/server.R. C'est là que j'ai appris à utiliser 'reactiveValues'! – Enzo

+0

Merci, cela semble définitivement prometteur! :) dois y jeter un coup d'œil –