2015-08-14 4 views
5

In meiner glänzenden App möchte ich in der Lage, auf einen Download-Button klicken, haben Sie eine Funktion ausführen Ich habe (in einem Paket), erstellt ein PDF in einem/results-Ordner, dann bieten Sie diese erstellte Datei als Download für den glänzenden App-Benutzer. Ich habe meinen aktuellen download_portfolio download button code vom Server unten eingefügt (so viele Stücke sind mir nicht sicher, wie ich es reproduzierbar machen kann). Ich wollte sehen, ob jemand eine Idee davon hat, was schief geht, ich bekomme die Fehlermeldung unten, aber die Funktion FUNCTION_TO_GENERATE_PDF_IN_/results() wird ausgeführt und erstellt die PDF, aber die App wird neu geladen und der Benutzer wird nie aufgefordert, einen Download durchzuführen.Shiny App Code ausführen, um ein PDF zu generieren, dann das PDF zum Benutzer zum Download anbieten

Fehler Ich erhalte (aber die PDF wird immer noch richtig aus meiner Funktion generiert, nur die App neu geladen und es gibt kein Angebot zum Herunterladen der PDF).

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

app.R Code, wo ich auf dem Download arbeitete

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

Antwort

4

Sie sind die downloadHandler falsch verwenden. Sie benötigen hier keine observe()-Funktion, da glänzend "reactivity" bereitstellt, was bedeutet, dass Sie Objekte an ui-Elemente binden können, die aktualisiert werden, wenn sich das Objekt ändert. Daher brauchen Sie nur ein downloadHandler auf der Download-Taste zuweisen und sie sagen, wie die Datei, die Sie zur Verfügung stellen möchten generieren:

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) 

Allerdings brauchen Sie nicht zuerst Ihre Dateien zu speichern, möchten Sie vielleicht um sie direkt in der Download-Schaltfläche zu speichern:

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) 
Verwandte Themen