Salvare le trame di fatto in un lucido app

Sto cercando di capire come utilizzare downloadButton per salvare una trama lucida con. L’esempio nel pacchetto dimostra downloadButton/downloadHandler per salvare una .csv. Sto andando a fare un riproducibili esempio in base a che.

Per ui.R

shinyUI(pageWithSidebar(
  headerPanel('Downloading Data'),
  sidebarPanel(
selectInput("dataset", "Choose a dataset:", 
            choices = c("rock", "pressure", "cars")),
    downloadButton('downloadData', 'Download Data'),
    downloadButton('downloadPlot', 'Download Plot')
  ),
  mainPanel(
    plotOutput('plot')
  )
))

Per server.R

library(ggplot2)
shinyServer(function(input, output) {
  datasetInput <- reactive({
    switch(input$dataset,
           "rock" = rock,
           "pressure" = pressure,
           "cars" = cars)
  })

  plotInput <- reactive({
    df <- datasetInput()
    p <-ggplot(df, aes_string(x=names(df)[1], y=names(df)[2])) +
      geom_point()
  })

  output$plot <- renderPlot({
    print(plotInput())
  })

  output$downloadData <- downloadHandler(
    filename = function() { paste(input$dataset, '.csv', sep='') },
    content = function(file) {
      write.csv(datatasetInput(), file)
    }
  )
  output$downloadPlot <- downloadHandler(
    filename = function() { paste(input$dataset, '.png', sep='') },
    content = function(file) {
      ggsave(file,plotInput())
    }
  )
})

Se si sta rispondendo a questa domanda, si sono probabilmente familiarità con questo, ma per ottenere questo lavoro, salva la precedenza in script separati (ui.R e server.R in una cartella (foo) all’interno della directory di lavoro. Per eseguire il lucido app, eseguire runApp("foo").

Utilizzando ggsave, ricevo un messaggio di errore che indica che ggsave non è possibile utilizzare il filename funzione (credo). Se io uso la grafica standard del dispositivo (come di seguito), il Download Plot funziona senza un errore, ma non scrivere la grafica.

Eventuali suggerimenti per ottenere il downloadHandler di lavoro per la scrittura di trame sarebbe apprezzato.

InformationsquelleAutor alexwhan | 2013-02-11



4 Replies
  1. 55

    Non so se questa domanda è ancora attivo, ma è il primo che è venuto durante la ricerca per “salvare i grafici in lucido app” così ho voluto aggiungere rapidamente come ottenere ggsave a lavorare con downloadHandler lungo le linee della domanda originale.

    Strategie alternative suggerite da juba utilizzando l’uscita invece di ggsave e strategia alternativa suggerita da alexwhan stesso sia grande lavoro, questo è solo per chi vuole assolutamente utilizzare ggsave in downloadHandler).

    Il problema segnalato da alexwhan è causato da ggsave cercando di abbinare l’estensione del file per il corretto dispositivo di grafica. Il file temporaneo, tuttavia, non hanno un’estensione in modo che la corrispondenza non riesce. Questo può essere risolta in modo particolare se si imposta il dispositivo in ggsave chiamata di funzione, come nell’originale codice di esempio (per un png):

    output$downloadPlot <- downloadHandler(
        filename = function() { paste(input$dataset, '.png', sep='') },
        content = function(file) {
            device <- function(..., width, height) grDevices::png(..., width = width, height = height, res = 300, units = "in")
            ggsave(file, plot = plotInput(), device = device)
        }
    )

    Questa chiamata semplicemente prende il device funzione per un png che ggsave assegna internamente (puoi guardare il ggsave codice funzione per visualizzare la sintassi per jpg, pdf, ecc). Forse, idealmente, si potrebbe specificare l’estensione del file (se diverso dal nome del file – come è il caso qui per il file temporaneo) come ggsave parametro, ma questa opzione non è attualmente disponibile nel ggsave.


    Un minimo di self-contained di lavoro esempio:

    library(shiny)
    library(ggplot2)
    runApp(list(
      ui = fluidPage(downloadButton('foo')),
      server = function(input, output) {
        plotInput = function() {
          qplot(speed, dist, data = cars)
        }
        output$foo = downloadHandler(
          filename = 'test.png',
          content = function(file) {
            device <- function(..., width, height) {
              grDevices::png(..., width = width, height = height,
                             res = 300, units = "in")
            }
            ggsave(file, plot = plotInput(), device = device)
          })
      }
    ))
    
    sessionInfo()
    # R version 3.1.1 (2014-07-10)
    # Platform: x86_64-pc-linux-gnu (64-bit)
    # 
    # locale:
    #  [1] LC_CTYPE=en_US.UTF-8       LC_NUMERIC=C              
    #  [3] LC_TIME=en_US.UTF-8        LC_COLLATE=en_US.UTF-8    
    #  [5] LC_MONETARY=en_US.UTF-8    LC_MESSAGES=en_US.UTF-8   
    #  [7] LC_PAPER=en_US.UTF-8       LC_NAME=C                 
    #  [9] LC_ADDRESS=C               LC_TELEPHONE=C            
    # [11] LC_MEASUREMENT=en_US.UTF-8 LC_IDENTIFICATION=C       
    # 
    # attached base packages:
    # [1] stats     graphics  grDevices utils     datasets  methods   base     
    # 
    # other attached packages:
    # [1] ggplot2_1.0.0 shiny_0.10.1 
    # 
    # loaded via a namespace (and not attached):
    #  [1] bitops_1.0-6     caTools_1.17     colorspace_1.2-4 digest_0.6.4    
    #  [5] formatR_1.0      grid_3.1.1       gtable_0.1.2     htmltools_0.2.6 
    #  [9] httpuv_1.3.0     labeling_0.2     MASS_7.3-34      munsell_0.4.2   
    # [13] plyr_1.8.1       proto_0.3-10     Rcpp_0.11.2      reshape2_1.4    
    # [17] RJSONIO_1.3-0    scales_0.2.4     stringr_0.6.2    tools_3.1.1     
    # [21] xtable_1.7-3    

    Aggiornamento

    Di ggplot2 versione 2.0.0, il ggsave funzione supporta l’input di caratteri per il device parametro, il che significa che il file temporaneo creato da downloadHandler possono ora essere salvati con una chiamata diretta a ggsave, specificando che l’estensione dovrebbe essere, per esempio "pdf" (piuttosto che di passaggio in funzione del dispositivo). Questo semplifica l’esempio di cui sopra per i seguenti

    output$downloadPlot <- downloadHandler(
        filename = function() { paste(input$dataset, '.png', sep='') },
        content = function(file) {
            ggsave(file, plot = plotInput(), device = "png")
        }
    )
    • Credo che la risposta è in realtà corretto qui. Si può anche usare ggsave(file, plotInput(), device = png) invece di creare un dispositivo (wrapper) funzione.
    • Mi sono perso la tua risposta nel corso di questo anno e un po’!
    • Questa soluzione non funziona per me: R versione 3.1.0, ggplot2_1.0.0 shiny_0.10.1. Salvare finestra si apre, fare clic su salva, ma il file non viene salvato. Qualcuno può confermare?
    • Ho appena aggiunto un esempio completo per la risposta. Nota è necessario eseguire nel browser invece di visualizzare in RStudio, dal momento che il RStudio viewer è un bug noto di essere in grado di scaricare i file.
    • Grazie, sì, sono stato in esecuzione su RStudio visualizzatore… Ah!
    • Grazie per l’aggiunta l’esempio completo. Probabilmente si è trovato questo già, ma solo per precisazione: il dispositivo funzione wrapper è necessario perché i parametri passati da ggsave non sono sempre compatibili con le impostazioni predefinite del dispositivo (ad esempio, per il png funzione units parametro il valore di default è “px”). Per una soluzione generale a questa domanda, c’è un richiesta di pull per una caratteristica che permetterebbe ggsave(... device="png") come un modo facile per avere ggsave specificamente scegliere i propri png wrapper.
    • Sì, l’ho capito dopo che ho provato un esempio reale, quindi il mio primo commento qui era effettivamente sbagliato. Grazie per il chiarimento!
    • ggsave con argomento lastPlot() davvero salva la giornata!

  2. 22

    Ecco una soluzione che permette di utilizzare ggsave per il salvataggio lucido trame. Esso utilizza una logica casella di inserimento del testo e per chiamare ggsave(). A questo si aggiungono ui.R file all’interno sidebarPanel:

    textInput('filename', "Filename"),
    checkboxInput('savePlot', "Check to save")

    Poi a questo si aggiungono server.R file di output$plot reactivePlot funzione:

    output$plot <- reactivePlot(function() {
        name <- paste0(input$filename, ".png")
        if(input$savePlot) {
          ggsave(name, plotInput(), type="cairo-png")
        }
        else print(plotInput())
      })

    Un utente può digitare il nome di file desiderato nella casella di testo (senza estensione) e spuntare la casella di controllo per salvare nella cartella app. Deselezionando la casella stampa il grafico di nuovo. Sono sicuro che ci sono più accurate di modi per farlo, ma almeno ora posso usare ggsave e il cairo in windows per molto più bello di grafica png.

    Si prega di aggiungere tutti i suggerimenti che potete avere.

    • Senza un isolate blocco di tutto il input$filename, qualsiasi modifica al filename casella di testo viene inoltre richiesto un file di salvataggio se la casella è selezionata.
  3. 21

    Non sono riuscito a farlo funzionare con ggsave, ma con una chiamata standard per png() sembra essere tutto ok.

    Ho modificato solo il output$downloadPlot parte del vostro server.R file :

     output$downloadPlot <- downloadHandler(
        filename = function() { paste(input$dataset, '.png', sep='') },
        content = function(file) {
          png(file)
          print(plotInput())
          dev.off()
        })

    Nota che ho avuto alcuni problemi con la versione 0.3 di lucido, ma funziona con l’ultima da Github :

    library(devtools)
    install_github("shiny","rstudio")
    • OK, ho intenzione di accettare che ggsave non va al lavoro in questa fase del procedimento con downloadHandler. lucido 0.3 cade a pezzi con downloadHandler, hai ragione. Vi posto una soluzione alternativa, come ho capito, evitando downloadHandler che permetterà ggsave di lavoro.
    • qualche idea del perché questo tentativo di output pdf con una simile (non ggplot2) metodo non funziona? Ho appena rotto pdf che non si apre. Può plotInput non in grado di fornire una trama invece di un terreno oggetto?
  4. 17

    Questo è vecchio, ma ancora il top colpito quando qualcuno googles “R lucido salvare ggplot”, così ho contribuirà un’altra soluzione. Molto semplice… chiamare ggsave la stessa funzione che visualizza un grafico, che permetterà di salvare il grafico come un file sul server.

    output$plot <- renderPlot({
        ggsave("plot.pdf", plotInput())
        plotInput()
    })

    Quindi, utilizzare downloadHandler e utilizzare file.copy() per scrivere i dati da file esistente “file” parametro.

    output$dndPlot <- downloadHandler(
        filename = function() {
            "plot.pdf"
        },
        content = function(file) {
            file.copy("plot.pdf", file, overwrite=TRUE)
        }
    )

    Funziona per me.

Lascia un commento