2013-12-10 6 views
8

Czy niektóre części aplikacji RShiny mogą działać w sposób opóźniony, podobnie jak Opóźniony start w Usługach Windows?Opóźniona realizacja w aplikacji R Shiny

Pozwolę sobie rozwinąć.

Mam błyszczącą aplikację z zakładkami. Każda zakładka zawiera kilka przycisków radiowych na pasku bocznymPanel. Kliknięcie każdego przycisku opcji powoduje wygenerowanie raportu. Moja konfiguracja jest tak prosta jak ta.

Jednak, gdy ładuję aplikację za każdym razem i gdy pierwsza karta jest automatycznie renderowana, wszystkie raporty powiązane z wszystkimi przyciskami radiowymi w tej zakładce są wykonywane, a następnie wybierany jest pierwszy przycisk opcji i wyświetlany jest raport korelacji. Cały ten proces zajmuje około 10-11 sekund, które chcę usunąć.

Podczas uruchamiania serwera po prostu odczytuję plik myData.RData w pliku global.R. Wszystkie dane są wstępnie pobierane (i zakładam, że są przechowywane w pamięci) podczas uruchamiania serwera. Co się stanie, gdy karta zostanie ustawiona na ostrość, to dane read.frames z myData.RData są odczytywane i wywoływana jest seria ggplots (renderPlot) i tabele (renderText).

Czy istnieje sposób, w jaki mogę renderować pierwszy raport w ciągu kilku sekund, a następnie przejść do wykonywania innych ggplotów i tabel? Przeszedłem przez przewodniki i izolacje reaktywności, ale nie mogłem ustalić, jakie rozwiązanie pasuje do mojego problemu.

Czy istnieje inny sposób, w jaki mogę przyspieszyć ładowanie (i odświeżanie) czasu?

Niektóre kod, aby pomóc zrozumieć ten problem ..

# 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

Może pokażesz nam swój 'server.R',' ui.R' i wszelkich innych niezbędnych kodu? – MadScone

+0

Dodałem fragment kodu. Mam nadzieję że to pomoże. Dzięki. – shingav

Odpowiedz

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

Wielkie dzięki Joe. – shingav

+0

Czy jest to przypadkiem stosowalne tylko do renderText? Nie mogłem zlokalizować żadnej dokumentacji dotyczącej zdarzeń sesyjnych i OnFlused. Moje renderPlot wydaje się nie mieć żadnej poprawy. – shingav

+0

@RohithVenkatakrishna Nie, nie sądzę, że jest związany z 'renderText()'; możesz użyć dowolnej funkcji 'render ???'. –

Powiązane problemy