2013-12-10 14 views
8

Ist es möglich, viel einige Teile RShiny App in einer verzögerten Art und Weise auszuführen haben, wie der Verzögerter Start in Windows Service?Verzögerte Ausführung in R Shiny App

Lassen Sie mich näher ausführen.

Ich habe eine glänzende App mit Tabs. Jede Registerkarte verfügt über eine Reihe von Optionsfeldern auf dem SidebarPanel. Ein Klick auf jedes Optionsfeld öffnet einen Bericht. Mein Setup ist so einfach.

Wenn ich jedoch die App jedes Mal lade und wenn die erste Registerkarte automatisch gerendert wird, werden alle Berichte, die mit allen Optionsfeldern auf dieser Registerkarte verknüpft sind, ausgeführt, und dann wird das erste Optionsfeld ausgewählt und der entsprechende Bericht angezeigt. Dieser ganze Vorgang dauert etwa 10-11 Sekunden, die ich herunterfahren möchte.

Während der Server-Start, ich lese einfach meine myData.RData Datei in global.R. Daher werden alle Daten während des Serverstarts vorab abgerufen (und ich nehme an, dass sie im Speicher gehalten werden). Was passiert, wenn die Lasche zu konzentrieren gebracht ist, dass die data.frames von myData.RData gelesen werden und eine Reihe von ggplots (renderPlot) und Tabellen (render) genannt werden.

Gibt es eine Weise, die ich den ersten Bericht innerhalb von wenigen Sekunden machen kann und dann zum Ausführen von anderen ggplots und Tabellen vorgehen? Ich ging durch Reaktivitätsleiter und Isolierungen, konnte aber nicht herausfinden, welche Lösung zu meinem Problem passt.

Oder gibt es eine andere Art, wie ich die Last speeden kann (und aktualisieren) Zeit?

Einige Code, um das Problem zu verstehen ..

# In server.R 

    library(shiny) 
    library(plyr) 
    library(ggplot2) 
    library(grid) 

    source("a.R", local=TRUE) 
    source("b.R", local=TRUE) 

    shinyServer(function(input, output) { 

     # The below two lines represent a report pair to me. So I have a Bar plot and the associated Table report. 
     output$wSummaryPlot = renderPlot({ print(drawBarPlotA("Bar Plot A")) }) 
     output$wSummaryTable = renderText({ tableA() }) 

     # There are about 20 such pairs in server.R 

     # Please note that I am including other R file by "source". The first two lines shows that. Don't know if that is what is causing the problem. 

     # The drawBarPlotA and tableA are functions defined in one of the source files which are included above. 
     # There are 5 such files which are included similarly. 
    }) 

    # In ui.R 
    shinyUI(pageWithSidebar(
     headerPanel(windowTitle = "Perfios - DAS", addHeader()), 

     sidebarPanel(
      conditionalPanel(condition = "input.reportTabs == 1 && input.reportType == 'reportTypeA'", 
         wellPanel(radioButtons("showRadio", strong("Attributes:"), 
               c("Analysis A" = "a", 
                "Analysis B" = "b", 
                "Analysis C" = "c", 
                "Analysis D" = "d", 
                "Analysis E" = "e", 
                "Analysis F" = "f" 
               ))) 
     )) 

     mainPanel(
      tabPanel("A", value = "1", 
       conditionalPanel(condition = "input.reportType == 'reportTypeA'", 
            conditionalPanel(condition = "showRadio == 'X'", 
                plotOutput("wSummaryPlot"), h4("Summary:"), verbatimTextOutput("wSummaryTable")) 


     # Many such element here to accomodate for those 20 reports... 
    ))) 
)) 

# In drawBarPlotA 
drawBarPlotA = function(mainText) { 
    ggplot(data, aes(variable, value, fill = some_fill)) + 
    geom_bar(stat = "identity", position = "dodge", color = "grey") + 
    ylab("Y Label") + 
    xlab(NULL) + 
    theme_bw() + 
    ggtitle(mainText) + 
    scale_fill_brewer(palette = "Set1") + 
    annotate("text", x = 1.2, y = 0, label = "Copyright...", size = 4) + 
    theme(axis.text.x = element_text(angle = 45, hjust = 1, size = "12", face = "bold"), 
      axis.text.y = element_text(size = "12"), 
      plot.title = element_text(size = "14", vjust = 3, face = "bold")) 
} 

tableA = function() { 
    # This is a data.frame which is returned 
    data 
} 
+0

Können Sie zeigen uns Ihren 'server.R',' ui.R' und anderen notwendigen Code? – MadScone

+0

Ich habe ein Code-Snippet hinzugefügt. Hoffe das hilft. Vielen Dank. – shingav

Antwort

9
shinyServer(function(input, output, session) { 
    values <- reactiveValues(starting = TRUE) 
    session$onFlushed(function() { 
    values$starting <- FALSE 
    }) 

    output$fast <- renderText({ "This happens right away" }) 
    output$slow <- renderText({ 
    if (values$starting) 
     return(NULL) 
    "This happens later" 
    }) 
}) 
+0

Vielen Dank Joe. – shingav

+0

Ist dies möglicherweise nur auf renderText anwendbar? Ich konnte keine Dokumentation zu Session- und onFlused-Ereignissen finden. Mein RenderPlot scheint keine Verbesserung zu haben. – shingav

+0

@RohithVenkatakrishna Nein, ich glaube nicht, dass es an 'renderText()' gebunden ist; Sie können alle 'render ???' -Funktionen verwenden. –