2013-06-24 24 views
10

downloadHandler() çağrısı içinde, bu nesnenin ayrı, yedekli bir örneğini oluşturmak zorunda kalmadan, nesneleri parlak bir şekilde indirmek mümkün mü? Örneğin, aşağıdaki örnek ele alalım:Parlak Nesnede Reaktif Nesneleri İndirme

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) 
    } 
) 

}) 

Yukarıdaki örnekle var Sorunum renderTable() hem içinde runQuery() çalıştırıyorum olmasıdır ve downloadHandler() çağrıları. Bu örnekte gerçekten fazladan bir yük yok ama benim gerçek örneğimde bu bir 5-10 dakikalık bir süreç gerektiriyor, bu yüzden birisi veriyi indirdiğinde iki kez çağırmak için son derece verimsiz.

Bu soruna, downloadHandler() numaralı çağrıda veya başka bir işte önceden oluşturulmuş bir nesneyi referans alarak bulabilir miyim?

+0

Sorgulama hızlandırılabilir mi? data.table' veya başka bir şey? Sorgularınız bu kadar uzun sürüyorsa, sorun yükleyici olduğunu düşünmüyorum. – intra

+0

Ne yazık ki değil - bir veri tabanı için bir kovan sorgu. – David

cevap

16

Evet! Sorguyu, iki yerden çağıran bir işlevden, iki yerden eriştiğiniz reaktif bir ifadeye dönüştürün. Reaktif ifadeler, sonuçlarını otomatik olarak önbelleğe alır.

+0

Teşekkürler Joe! Ben sadece makeQuery() ve runQuery() işlevlerini aynı reaktif işleve taşıdım ve bu hile yaptı. – David

+0

Önceden depolanmış reaktif değeri depolamanız gerekirse, örneğin rv $ myResultDataFrame ?? – aloplop85