2013-06-24 8 views
10

Czy można pobierać obiekty w kolorze błyszczącym bez konieczności tworzenia oddzielnej, redundantnej instancji tego obiektu w ramach wywołania downloadHandler()? Na przykład, rozważmy następujący przykład:Pobieranie obiektów reaktywnych w kolorze błyszczącym

ui.R

library(shiny) 

shinyUI(pageWithSidebar(
    headerPanel("Simple Example"), 

    sidebarPanel(
    textInput("options","Enter some content:",""), 
    submitButton("Go") 
), 

    mainPanel(
    tableOutput("dataTable"), 
    downloadButton('downloadData','Save Data as CSV File') 
) 
)) 

server.R

library(shiny) 

shinyServer(function(input, output) { 
    makeQuery <- reactive({ 
     if(input$options == ""){ 
     return("Enter some options") 
     } 
     else { 
     return(input$options) 
     } 
    }) 

    runQuery <- function(query){ 
    dat <- data.frame(v1=rep(query,5)) 
    return(dat) 
    } 

    output$dataTable <- renderTable({ 
    query <- makeQuery() 
    if(grepl("^Enter",query)){ 
     return(data.frame(Error=query)) 
    } else { 
     return(runQuery(query)) 
    } 
    },include.rownames=FALSE) 

    output$downloadData <- downloadHandler(
    filename = c('data.csv'), 
    content = function(file) { 
     write.csv(runQuery(makeQuery()), file) 
    } 
) 

}) 

Problem mam z powyższym przykładzie jest to, że używam runQuery() w terminie zarówno renderTable() i połączenia downloadHandler(). W tym przykładzie nie ma żadnego dodatkowego obciążenia, ale na moim prawdziwym przykładzie wymaga to uruchomienia procesu trwającego 5-10 minut, więc wywołanie go dwa razy, gdy ktoś pobierze dane, jest niezwykle nieefektywne.

Czy istnieje możliwość obejścia tego problemu przez odwołanie się do już utworzonego obiektu w wywołaniu downloadHandler() lub innej pracy?

+0

Czy można w ogóle zapytać o przyspieszenie? 'data.table' lub coś takiego? Nie sądzę, że problem jest z obsługą pobierania, jeśli twoje zapytania trwają tak długo. – intra

+0

Niestety nie - to kwerenda z gałęzi do bazy danych. – David

Odpowiedz

16

Tak! Zmień zapytanie z funkcji wywoływanej z dwóch miejsc na wyrażenie reaktywne, do którego masz dostęp z dwóch miejsc. Wyrażenia reaktywne buforują wyniki automatycznie.

+0

Dzięki Joe! Właśnie przeniosłem pracę z obu makeQuery() i runQuery() do tej samej funkcji reaktywnej i to wystarczyło. – David

+0

Co zrobić, jeśli potrzebujesz przechowywać wcześniej zapisaną wartość reaktywną, taką jak rv $ myResultDataFrame ?? – aloplop85

Powiązane problemy