Ich habe eine Simulation in R geschrieben, die ich jetzt mit glänzend visualisieren möchte. Ich habe den Hauptteil der Simulation in einen Block setzen, um ausgewertet zu werden. Während dieses Evaluierungsprozesses, d. H. Für jede Iteration, möchte ich den aktuellen Status darstellen. Die Frage ist, wie kann ich dies erreichen, da in meinem tatsächlichen Code das Rendern des Plots nur ausgeführt wird, nachdem der Hauptbeobachter evaluiert wurde. Gibt es eine Möglichkeit, zum Beispiel die Ausführung des Beobachtungsblocks zu unterbrechen und nach der Aktualisierung des Diagramms fortzusetzen?Update-Plot innerhalb der Beobachterschleife in glänzender Anwendung
Sollte es nicht noch mehr Funktionalität von shiny geben, um einen solchen Fall anzugehen, da ich mir vorstellen kann, dass ich nicht der Einzige bin, der so etwas machen möchte ?!
Es wäre schön, wenn Sie mir helfen können mit dieser :) ist
Im Folgenden einig Skeleton-Code für den Server und ui.
ui.R:
library(shiny)
shinyUI(pageWithSidebar(
headerPanel("... Simulation"),
sidebarPanel(
sliderInput("epochs",
"Number of Epochs:",
min = 1,
max = 100,
value = 10),
verbatimTextOutput("curr.iter"),
actionButton("actionB", "Action!")
),
mainPanel(
plotOutput("distPlot")
)
))
server.R:
library(shiny)
sinus <- data.frame()
shinyServer(function(input, output) {
dummy <- reactiveValues(iter=0)
obsMain <- observe({
for (i in 1:input$epochs) {
cat(i, " ")
x <- seq(1:input$epochs)
y <- sin(x)
sinus <<- data.frame(x, y)
dummy$iter <- i
#
# At this time I want distPlot & curr.iter to be evaluated/updated!
#
Sys.sleep(1)
}
}, suspended=TRUE)
obsAction <- observe({ if(input$actionB > 0) obsMain$resume() }) # Helps to avoid initial evaluation of obsMain...
output$curr.iter <- renderText({ as.numeric(dummy$iter) })
output$distPlot <- renderPlot({ if (dummy$iter > 1) plot(sinus, type="l") })
})
Danke für Ihre Antwort. Ich habe bereits die Möglichkeit eines reaktiven Timers gesehen, aber ich habe einfach das Sys gesetzt.sleep() -Befehl, um etwas Zeit für das Erscheinen des Plots zu reservieren (in RStudio zum Beispiel muss ich es meistens auf die gleiche Weise tun, sonst wird das Plot nicht angezeigt). In meiner Simulation wird die Rechenaufgabe die notwendige Verzögerung erzeugen. Ich frage mich nur, ob es eine Möglichkeit gibt, das Rendern des Plots (wann immer ich will) auszulösen und daher die Simulation Engine so zu belassen, wie es ist, ohne die Schleife der Simulation rekonstruieren zu müssen. – user3220352
Sie können das Diagramm jederzeit rendern. Das Problem ist, dass R single-threaded ist. Wenn es also mit der Verarbeitung Ihrer Simulation beschäftigt ist, werden andere reaktive Abhängigkeiten nicht ausgewertet. Dies ist noch kein gut durchdachter Teil von Shiny, aber momentan denke ich, dass Sie die "große" Verarbeitung (Simulation) so planen müssen, dass sie in kleinen Blöcken (1 oder nur wenige Iterationen) stattfindet treten alle paar Millisekunden auf - die Idee ist, dass die CPU nicht zu 100% mit dem Ausführen der Simulation beschäftigt ist, was Zeit gibt, andere reaktive Kontexte (wie Ihre Handlung) auszuwerten. –
Ich würde empfehlen, es mit einem reaktiven Timer geplant 1/Sekunde. Sehen Sie, dass Sie die Architektur zum Laufen bringen können, und revidieren Sie von dort aus, um den Timer entweder auf ein viel kleineres Intervall herunterzufahren oder mehr als eine Iteration zu machen, wenn der Timer ausgelöst wird. –