2014-12-03 61 views
11

是否有輸出方法(UI結束)應用程序用戶下載的發光圖爲PDF?我已經嘗試了各種與ggplot相似的方法,但似乎downloadHandler不能以這種方式運行。例如,以下內容只會產生無法打開的PDF文件。將Shiny(non-ggplot)繪圖輸出爲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") 
     }) 
    } 
)) 

非常感謝您的協助。

+0

作爲參考,@ Victorp的方法如下當在託管失敗[shinyapps.io] (https://geotheory.shinyapps.io/pdf_test/),錯誤:只能從屏幕設備打印。 – geotheory 2014-12-08 16:35:57

回答

6

解決。該圖應該在本地保存爲pdf(),而不是屏幕設備(與dev.copy2pdf一樣)。這是一個工作示例:shiny::runGist('d8d4a14542c0b9d32786')。對於一個很好的基本模式的嘗試:

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

(你好),只需使用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() 
     }) 
    } 
)) 

編輯:我不知道......這很奇怪。一種解決方法是使用dev.copy2pdf像你擺在首位,但在reactive功能確實不是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

是的,我在Windows上,我在Linux上也很努力,但我沒有Mac ... – Victorp 2014-12-04 09:12:48

+0

是的抱歉Victorp我需要重新打開這個解決方案是Windows特有的, 'shinyapps.io'。 – geotheory 2014-12-08 16:38:07

+0

沒問題,我很好奇答案。 – Victorp 2014-12-08 17:03:54