2015-07-08 11 views
20

Ist es technisch in R möglich?Gleichzeitige Zugriff auf die Umgebung aus zwei R-Sitzungen

Ich möchte eine glänzende Instanz mit vorbereiteten R6-Objekt (Umweltklasse) ausführen, verwenden Sie ihre Methoden - meist nur lesen.
Während ich gleichzeitig eine glänzende App laufe möchte ich andere Methoden meines R6 aufrufen - lesen/schreiben.
Shiny R-Sitzung könnte ein Host für mein R6-Objekt sein, während die zweite Sitzung von geplantem R-Skript/interaktiv von R-Konsole aufgerufen werden würde.
Gegenwärtig denke ich, dass ich R-Skript direkt von glänzend unter einem Knopf beziehen kann, aber dies beschränkt die Interaktivität.

+0

Ich bin mir nicht sicher, ob ich das richtig verstehe, aber ich glaube, Sie könnten die Parallelisierung beschreiben? – Roland

+0

@Roland 2 parallele Verbindungen zu R6-Klasse, die ganz andere Dinge tun. Eine Verbindung könnte auch interaktive R-Konsole sein. – jangorecki

+0

Wenn ich es richtig verstehe, könnten Sie die Umgebung gelegentlich auf dem Server oder bei Ereignis/Beobachtung speichern. In Ihrer anderen Sitzung könnten Sie dieses gespeicherte Objekt laden. –

Antwort

1

Dieser Artikel beschreibt die scoping rules for Shiny apps und wie globale Daten mit unterschiedlich verpackten Code definiert werden. Unten ist mein Beispiel für eine globale Variable, die Daten enthält, auf die mehrere Sitzungen zugreifen können.

Führen Sie diese App aus, öffnen Sie dann ein zweites Tab/Fenster in Ihrem Browser und zeigen Sie auf dieselbe Verbindung. Sie können auf die + 1-Schaltfläche in einer Sitzung klicken, um die gemeinsame maximale und lokale Anzahl zu erhöhen. In der anderen Sitzung sehen Sie keine Änderung, bis etwas glänzend ausgelöst wird, um die freigegebenen Daten erneut zu prüfen. Wenn Sie jedoch auf die Schaltfläche + 1 klicken, wird die lokale Anzahl aktualisiert, aber auch die Aktualisierung des gemeinsamen maximalen Datenwerts ausgelöst. Sie können mehrmals auf die + 1-Schaltfläche klicken, bis Sie ein neues Maximum haben, und dann zum ersten Fenster zurückkehren. Dort sehen Sie auch das Maximum, sobald Sie auf die + 1-Schaltfläche klicken, um ein Update auszulösen. Dies funktioniert für mehrere Fenster.

Sie müssen etwas tun, um eine Sitzung zu überprüfen, die Daten erneut zu aktualisieren. Ich habe nicht zu hart gearbeitet, um dies ohne Nebenwirkungen zu erreichen. Es sollte eine Möglichkeit geben, einen "Refresh" durchzuführen, basierend auf welchem ​​Auslöser Sie auch wollen. Sie können sogar eine zeitgesteuerte Abfrage verwenden, um Daten synchron zu halten, wie es bei Dateien mit this example der Fall ist.

Der einzige Vorbehalt zu diesem Beispiel habe ich nur mit einer lokalen RStudio-Server-Implementierung versucht. Ich weiß nicht, dass es so auf einem echten Server funktioniert. Wenn nicht, bitte Kommentar zu diesem Effekt! Es wird wahrscheinlich nicht so auf glnnapps.io oder mit irgendeiner Art von Cloud/Load-Balancing im Allgemeinen funktionieren, da Sie nicht garantieren können, dass zwei Sitzungen eine App-Instanz auf einer Maschine teilen.

library(shiny) 

globalMax <- 0 

app <- shinyApp(
    ui= pageWithSidebar(
     headerPanel("Shared data demo"), 
     sidebarPanel(
     actionButton("plusButton", "+1") 
    ), 
     mainPanel(
     verbatimTextOutput("sharedMax") 
    ) 
    ), 
    server= function(input,output){ 
     observe({ 
     if (input$plusButton > globalMax) { 
      globalMax <<- input$plusButton 
     } 
     }) 
     output$sharedMax <- renderText({ 
     paste0("Shared max value: ", globalMax, "\n", 
       "Local value: ", input$plusButton) 
     }) 
    } 
) 

runApp(app) 
+0

Wie sollte ich von der separaten R-Konsole aus eine Verbindung herstellen, wenn sie bereits ausgeführt wird? – jangorecki

+0

Alle Code-Sharing-Daten müssen sich in derselben App befinden. Webbrowser-Sitzungen teilen nur interne Daten, da sie mit derselben App (derselben URL) verbunden sind. Sie könnten von einer Konsole aus eine Verbindung herstellen, wenn Sie über eine URL-Verbindung wie ein Browser-/Web-Scraping-Tool agieren, aber Daten würden über die Netzwerkverbindung gestreamt werden, wenn Sie die App "aus der App heraus" und in etwas anderes möchten. –

+0

Um es als eine Antwort zu akzeptieren, würde ich erwarten, dass es deckt * Sie könnten von einer Konsole verbinden, wenn Sie es wie ein Browser/Web-Scraping-Tool * gemacht haben. Dies ist in der Tat der springende Punkt - wie man eine Verbindung zur laufenden App herstellt und die Daten verändert, ohne sie von db neu zu laden. PS. Ich habe 1 Web-Browser-Sitzung und 1 R-Konsole-Sitzung, also nicht wirklich interessiert in Daten zwischen mehreren Web-Sitzungen geteilt. – jangorecki

0

Ich denke, ich habe aus Versehen getan, was Sie wollen - im Wesentlichen 2 Rtudio-Sitzungen parallel ausgeführt werden? Auf meinem Mac klicke ich einfach mit der rechten Maustaste auf RStudio und wähle Neues RStudio-Fenster. Ich habe es auch unter Windows gemacht, aber keinen Zugang zu einem ATM - sollte ähnlich sein. Wenn Sie 2 Sitzungen ausführen, können Sie das Original beibehalten und zurückverweisen, während Sie die 2. Instanz optimieren. Mit 2 Monitoren kann dies sehr praktisch sein, um die Entwicklungszeit auf knifflige Details zu beschleunigen;)

+0

Ich würde sagen, das wollte der OP nicht wissen, er bat darum, Daten zwischen zwei R-Sitzungen auf einem glänzenden Server zu teilen (nicht zwei Instanzen von RStudio zu starten) –

Verwandte Themen