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)
Ich bin mir nicht sicher, ob ich das richtig verstehe, aber ich glaube, Sie könnten die Parallelisierung beschreiben? – Roland
@Roland 2 parallele Verbindungen zu R6-Klasse, die ganz andere Dinge tun. Eine Verbindung könnte auch interaktive R-Konsole sein. – jangorecki
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. –