2014-12-03 5 views
11

Есть ли способ вывода (конец интерфейса) Блестящие графики в 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

ответ

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

(Hello), просто используйте 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: Я не знаю ... Это странно. Обойти это можно использовать 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

+0

Да, жаль Victorp Мне нужно снова открыть его, поскольку решение зависит от Windows, а также оно не работает для приложений, размещенных на 'shinyapps.io'. – geotheory

+0

Нет проблем, мне любопытно ответить. – Victorp

Смежные вопросы