2014-12-03 14 views
11

Esiste un metodo per stampare (fine dell'interfaccia utente) Grafici splendidi su PDF per scaricare l'utente dell'app? Ho provato vari metodi simili a quelli che coinvolgono ggplot, ma sembra che downloadHandler non possa funzionare in questo modo. Ad esempio quanto segue produce solo PDF spezzati che non si aprono.Stampa di un grafico lucido (non-ggplot) in PDF

library(shiny) 
runApp(list(
    ui = fluidPage(downloadButton('foo')), 
    server = function(input, output) { 
    plotInput = reactive({ 
     plot(1:10) 
    }) 
    output$foo = downloadHandler(
     filename = 'test.pdf', 
     content = function(file) { 
     plotInput() 
     dev.copy2pdf(file = file, width=12, height=8, out.type="pdf") 
     }) 
    } 
)) 

Molto grato per l'assistenza.

+0

Per riferimento, il metodo di @ Victorp seguito fallisce quando ospitata presso [shinyapps.io] (https://geotheory.shinyapps.io/pdf_test/) con "Errore: può stampare solo da un dispositivo di schermo". – geotheory

risposta

6

risolto. La trama deve essere salvata localmente con pdf(), non con il dispositivo dello schermo (come con dev.copy2pdf). Ecco un esempio funzionante: shiny::runGist('d8d4a14542c0b9d32786'). Per un bel modello di prova di base:

server.R

library(shiny) 
shinyServer(
    function(input, output) { 

     plotInput <- reactive({ 
      if(input$returnpdf){ 
       pdf("plot.pdf", width=as.numeric(input$w), height=as.numeric(input$h)) 
       plot(rnorm(sample(100:1000,1))) 
       dev.off() 
      } 
      plot(rnorm(sample(100:1000,1))) 
     }) 

     output$myplot <- renderPlot({ plotInput() }) 
     output$pdflink <- downloadHandler(
      filename <- "myplot.pdf", 
      content <- function(file) { 
       file.copy("plot.pdf", file) 
      } 
     ) 
    } 
) 

ui.R

require(shiny) 
pageWithSidebar(
    headerPanel("Output to PDF"), 
    sidebarPanel(
     checkboxInput('returnpdf', 'output pdf?', FALSE), 
     conditionalPanel(
      condition = "input.returnpdf == true", 
      strong("PDF size (inches):"), 
      sliderInput(inputId="w", label = "width:", min=3, max=20, value=8, width=100, ticks=F), 
      sliderInput(inputId="h", label = "height:", min=3, max=20, value=6, width=100, ticks=F), 
      br(), 
      downloadLink('pdflink') 
     ) 
    ), 
    mainPanel({ mainPanel(plotOutput("myplot")) }) 
) 
3

(Ciao), basta usare pdf:

library(shiny) 
runApp(list(
    ui = fluidPage(downloadButton('foo')), 
    server = function(input, output) { 
    plotInput = reactive({ 
     plot(1:10) 
    }) 
    output$foo = downloadHandler(
     filename = 'test.pdf', 
     content = function(file) { 
     pdf(file = file, width=12, height=8) 
     plotInput() 
     dev.off() 
     }) 
    } 
)) 

EDIT: Non lo so ... E 'strano. Una soluzione è quella di utilizzare dev.copy2pdf come avete fatto, in primo luogo, ma nella funzione reactive invece downloadHandler:

## server.R 
library(shiny) 
shinyServer(
    function(input, output) { 
    plotInput <- reactive({plot(rnorm(1000)) 
          dev.copy2pdf(file = "plot.pdf") 
          }) 
    output$myplot <- renderPlot({ plotInput() }) 
    output$foo <- downloadHandler(
     filename <- "plot.pdf", 
     content <- function(file) { 
     file.copy("plot.pdf", file) 
     }) 
    } 
) 
+1

Sì, sono su Windows, lotto anche su Linux, ma non ho un Mac ... – Victorp

+0

Sì scusa Victorp Ho bisogno di riaprire questo perché la soluzione è specifica per Windows, e inoltre fallisce per le app ospitate su 'shinyapps.io'. – geotheory

+0

Nessun problema, sono curioso di sapere la risposta. – Victorp

Problemi correlati