2015-08-14 8 views
5

Nella mia app lucida voglio poter fare clic su un pulsante di download, far sì che esegua una funzione che ho (in un pacchetto) che crea un pdf in una cartella/risultati, quindi offrire il file creato come download all'utente di app lucido. Ho incollato il mio attuale codice pulsante download_portfolio dal server sottostante (così tanti pezzi non sono sicuro di come posso renderlo riproducibile). Volevo vedere se qualcuno ha un'idea di cosa sta andando storto, ho ricevuto il messaggio di errore qui sotto, tuttavia la funzione FUNCTION_TO_GENERATE_PDF_IN_/results() viene eseguita e creare il PDF, ma poi l'app si ricarica e l'utente non viene mai richiesto per un download.Codice di esecuzione app lucido per generare un pdf quindi offrire all'utente PDF per il download

Errore Ricevo (ma il pdf è ancora generato correttamente dalla mia funzione, solo l'app si ricarica e non vi è alcuna offerta per scaricare il pdf).

Error in self$downloads$set(name, list(filename = filename, contentType = contentType, : 
     argument "content" is missing, with no default 

codice app.R dove sto lavorando il download

observe({ 
    output$download_portfolio <- downloadHandler({ 
    FUNCTION_TO_GENERATE_PDF_IN_/results() 
    filename = function() { paste(input$pdfname) } 
    content = function(file) { 
     file.copy(paste("results/",input$pdfname, file, overwrite = TRUE) 
    } 
    }) 
    }) 

risposta

4

Si utilizza la downloadHandler in modo non corretto. Non hai bisogno di una funzione observe() qui, dato che lucida fornisce "reactivity", il che significa che puoi legare oggetti a elementi ui che vengono aggiornati ogni volta che l'oggetto cambia. Pertanto, è solo bisogno di assegnare un downloadHandler per il download-tasto e dirgli come generare il file che si desidera fornire:

library(shiny) 

ui <- fluidPage(# just the download-button and a textInput for the filename 
    textInput("pdfname", "Filename", "My.pdf"), 
    downloadButton("outputButton", "Download PDF") 
) 

server <- function(session, input, output) { 
    # No need for an observer! Just assign the downloadHandler to the button. 
    output$outputButton <- downloadHandler(input$pdfname, function(theFile) { 
    # The first parameter is the name given to the file provided for download to the user. 
    # The parameter in the function (theFile) is a placeholder for the name that is later 
    # assigned to the download-file. 

    # Now you can call your pdf-generating function... 
    makePdf() 

    # ... and use file.copy to provide the file "in" the save-button 
    file.copy(from = "/results/myGenerated.pdf", to = theFile) 
    }) 
} 

# Sample pdf-generating function: 
makePdf <- function(){ 
    pdf(file = "/results/myGenerated.pdf") 
    plot(cars) 
    dev.off() 
} 

shinyApp(ui = ui, server = server) 

Tuttavia, non è necessario per memorizzare i file prima, si potrebbe desiderare per salvarli direttamente "nel" pulsante di download:

library(shiny) 

ui <- fluidPage(# As above 
    textInput("pdfname", "Filename", "My.pdf"), 
    downloadButton("outputButton", "Download PDF") 
) 

server <- function(input, output) { 
    output$outputButton <- downloadHandler(input$pdfname, function(theFile) { 
    # Here, your pdf-generator is provided with the "filename" that is used 
    # to provide the file for the user. 
    makePdf(theFile) 
    }) 
} 

# Sample pdf-generating function: 
makePdf <- function(filename){ 
    pdf(file = filename) 
    plot(cars) 
    dev.off() 
} 

shinyApp(ui = ui, server = server)