2014-12-03 14 views
11

Çıkış yapılacak bir yöntem var mı (UI sonu) Uygulama kullanıcısının indirmesi için PDF'ye parlak çizimler var mı? Ggplot içerenlere benzer çeşitli yöntemler denedim, ancak downloadHandler bu şekilde çalışamaz gibi görünüyor. Örneğin, aşağıdakiler sadece açılmamış bozuk PDF'ler üretir.Parlak (ggplot olmayan) plotu çıktı olarak PDF'ye aktarma

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

Yardım için çok minnettarım.

+0

, aşağıdaki barındırılan başarısız Victorp yöntemi @ [shinyapps.io] (https://geotheory.shinyapps.io/pdf_test/) ile "Hata: yalnızca bir ekran aygıtından yazdırabilir". – geotheory

cevap

6

Çözüldü: Bir geçici çözüm yerine downloadHandler ilk etapta fakat reactive işlevinde olduğu gibi dev.copy2pdf kullanmaktır. Arsa, ekran aygıtını değil, pdf() ile yerel olarak kaydedilmelidir (dev.copy2pdf ile olduğu gibi). İşte çalışan bir örnek: shiny::runGist('d8d4a14542c0b9d32786'). Güzel bir temel model denemede için:

server.R referans için

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

(Merhaba), sadece pdf kullanın:

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: Bilmiyorum ... Bu garip.

## 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

Evet Windows'dayım, Linux'ta da mücadele ediyorum ama Mac'im yok ... – Victorp

+0

Evet üzgünüm Victorp Çözümü Windows'a özgü olduğu için yeniden açmam gerekiyor ve ayrıca, barındırılan uygulamalar için de başarısız oluyor. 'shinyapps.io'. – geotheory

+0

Sorun değil, cevabı merak ediyorum. – Victorp