Ich schreibe eine glänzende App, in der eine stochastische Funktion enthält generiert vier Objekte - ein Diagramm und drei Tabellen. Ich möchte jedoch jedes Objekt in verschiedenen Registerkarten rendern, ohne die Funktion viermal auszuführen, da diese stochastische Funktion vier verschiedene Versionen generiert. Ich wurde online recherchiert und finde viele Leute, die "reactive()" empfehlen, aber ich verstehe immer noch nicht ganz, wie ich es auf mein Problem anwenden soll. Wie kann ich diese vier Objekte beim Rendern mit nur einer Ausführung der Funktion verwenden?Wie rendert man mehrere Ausgaben aus derselben Analyse, ohne sie mehrfach auszuführen? (Shiny)
Meine „server.R“ Struktur im Grunde wie die unten aussieht:
shinyServer(function(input, output) {
stochastic_function() {
...
plot1 <- ...
table1 <- ...
table2 <- ...
table3 <- ...
result <- list(plot, table1, table2, table3)
return(result)
}
output$plot <- renderPlot({
})
output$table1 <- renderTable({
})
output$table2 <- renderTable({
})
output$table3 <- renderTable({
})
...
Also, ich habe für die stochastische Funktion so etwas wie unten versucht:
model <- eventReactive(input$goButton, {
reactive(WG_Model(cdata = cdata(), # load data from outside env
sdata = sdata(), # load data from outside env
N = input$n,
end_date = input$end_date,
cpx_goal = input$cpx,
N_new = input$n2,
end_date_new = input$end_date2,
spend_range = input$s_range,
spend_incr = input$s_incr
)
)
})
Die Idee ist, ein hinzufügen "GoButton" um die Funktion zu starten und dann alle Ausgänge in einem reaktiven fun() zu speichern. So kann ich jeden Ausgang mit Render:
output$plot <- renderPlot({
model$gplot
})
output$table <- renderTable({
model$table
})
# Render UI section
output$tb <- renderUI({
tabsetPanel(tabPanel("About Model", plotOutput("plot")),
tabPanel("About Model", tableOutput("table")))
})
aber ich bekam immer nur „Fehler: Objekte vom Typ‚Schließung‘ist nicht subsettable“ in der Benutzeroberfläche ausgegeben. Welchen Teil habe ich vermisst?
Hey @warmoverflow :) Ich habe noch nichts versucht, aber ich denke mit "Modell <- reaktiv (function() {..})" alle Ausgänge in eine Liste zu speichern. Dann rendere jede Ausgabe mit Listenindexierung wie "render ... (model() $ plot)". Ich versuche es. –
@warmoverflow Ich habe es getestet und habe eine Fehlermeldung erhalten. Ich habe den Beitrag mit dem Ergebnis aktualisiert. Bitte lassen Sie mich wissen, wenn Sie eine Idee haben. Danke! :) –
In 'reactiveEvent' brauchst du nicht mehr' reactive'. 'model' sollte einen Wert zurückgeben, auf den Sie mit' model() 'zugreifen können. Sie haben vergessen, Klammern innerhalb Ihrer 'render *' - Funktionen hinzuzufügen. (es sollte 'model() $ table' sein) –