2014-12-03 13 views
11

Czy istnieje metoda wydruku (koniec interfejsu użytkownika) Błyszczące wykresy do pliku PDF, aby użytkownik aplikacji mógł pobrać? Próbowałem różnych metod podobnych do tych z udziałem ggplot, ale wygląda na to, że downloadHandler nie może działać w ten sposób. Na przykład poniższe po prostu tworzy zepsute pliki PDF, które się nie otwierają.Wysyłanie wykresu Shiny (non-ggplot) do formatu 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") 
     }) 
    } 
)) 

Bardzo wdzięczny za pomoc.

+0

Dla porównania, @ metody Victorp jest poniżej zawiedzie podczas zorganizowanej w [shinyapps.io] (https://geotheory.shinyapps.io/pdf_test/) z 'Błąd: można drukować tylko z urządzenia ekranowego'. – geotheory

Odpowiedz

6

rozwiązany. Wykres powinien być zapisany lokalnie przy użyciu pdf(), a nie urządzenia ekranowego (jak w przypadku dev.copy2pdf). Oto działający przykład: shiny::runGist('d8d4a14542c0b9d32786'). Na miły podstawowy model Spróbuj:

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

(Halo), wystarczy użyć 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: Nie wiem ... To jest dziwne. Rozwiązaniem jest użycie dev.copy2pdf jak ty na pierwszym miejscu, ale w funkcji reactive zamiast 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

Tak, jestem w systemie Windows, ja też mam problemy z Linuksem, ale nie mam komputera Mac ... – Victorp

+0

Przepraszam, Victorp Muszę ponownie otworzyć to rozwiązanie, ponieważ jest to specyficzne dla systemu Windows, a także nie działa w przypadku aplikacji hostowanych pod adresem 'shinyapps.io'. – geotheory

+0

Nie ma problemu, jestem ciekawa odpowiedzi. – Victorp

Powiązane problemy