Сохранение участков, сделанных в блестящем приложении


Я пытаюсь выяснить, как использовать кнопку загрузки, чтобы сохранить сюжет с блестящим. Пример в пакете демонстрирует downloadButton / downloadHandler для сохранения a .csv. Я собираюсь сделать воспроизводимый пример, основанный на этом.

на ui.R

shinyUI(pageWithSidebar(
  headerPanel('Downloading Data'),
  sidebarPanel(
selectInput("dataset", "Choose a dataset:", 
            choices = c("rock", "pressure", "cars")),
    downloadButton('downloadData', 'Download Data'),
    downloadButton('downloadPlot', 'Download Plot')
  ),
  mainPanel(
    plotOutput('plot')
  )
))

на server.R

library(ggplot2)
shinyServer(function(input, output) {
  datasetInput <- reactive({
    switch(input$dataset,
           "rock" = rock,
           "pressure" = pressure,
           "cars" = cars)
  })

  plotInput <- reactive({
    df <- datasetInput()
    p <-ggplot(df, aes_string(x=names(df)[1], y=names(df)[2])) +
      geom_point()
  })

  output$plot <- renderPlot({
    print(plotInput())
  })

  output$downloadData <- downloadHandler(
    filename = function() { paste(input$dataset, '.csv', sep='') },
    content = function(file) {
      write.csv(datatasetInput(), file)
    }
  )
  output$downloadPlot <- downloadHandler(
    filename = function() { paste(input$dataset, '.png', sep='') },
    content = function(file) {
      ggsave(file,plotInput())
    }
  )
})

если вы отвечаете на этот вопрос, вы, вероятно, знакомы с этим, но, чтобы получить эту работу, сохранить в отдельные скрипты (ui.R и server.R в папка (foo) в рабочем каталоге. Чтобы запустить блестящее приложение, запустите runApp("foo").

используя ggsave, Я получаю сообщение об ошибке, указывающее, что ggsave не может использовать

4 71

4 ответа:

не уверен, что этот вопрос все еще активен, но это первый, который появился при поиске "сохранение участков в блестящем приложении", поэтому я хотел быстро добавить, как заставить ggsave работать с downloadHandler по строкам исходного вопроса.

альтернативные стратегии, предложенные Джубой, используя прямой выход вместо ggsave и альтернативную стратегию, предложенную самим alexwhan, отлично работают, это только для тех, кто абсолютно хочет использовать ggsave в downloadHandler).

проблема, о которой сообщает alexwhan, вызвана попыткой ggsave сопоставить расширение файла с правильным графическим устройством. Однако временный файл не имеет расширения, поэтому сопоставление не выполняется. Это можно исправить, специально установив устройство в ggsave вызов функции, как и в исходном примере кода (для png):

output$downloadPlot <- downloadHandler(
    filename = function() { paste(input$dataset, '.png', sep='') },
    content = function(file) {
        device <- function(..., width, height) grDevices::png(..., width = width, height = height, res = 300, units = "in")
        ggsave(file, plot = plotInput(), device = device)
    }
)

этот вызов в основном принимает

вот решение, которое позволяет использовать ggsave для сохранения блестящих участков. Он использует логический флажок и ввод текста для вызова ggsave(). Добавьте это к внутри sidebarPanel:

textInput('filename', "Filename"),
checkboxInput('savePlot', "Check to save")

затем добавьте это в вместо output$plot функция reactivePlot:

output$plot <- reactivePlot(function() {
    name <- paste0(input$filename, ".png")
    if(input$savePlot) {
      ggsave(name, plotInput(), type="cairo-png")
    }
    else print(plotInput())
  })

пользователь может затем введите желаемое имя файла в текстовое поле (без расширения) и установите флажок, чтобы сохранить в каталоге приложения. Сняв флажок, можно снова распечатать график. Я уверен, что есть более аккуратные способы сделать это, но, по крайней мере, теперь я могу использовать ggsave и cairo в windows для гораздо более приятной графики png.

пожалуйста, добавьте любые предложения вы можете иметь.

мне не удалось заставить его работать с ggsave, но со стандартным вызов png() кажется, все в порядке.

Я только изменил output$downloadPlot часть server.R file:

 output$downloadPlot <- downloadHandler(
    filename = function() { paste(input$dataset, '.png', sep='') },
    content = function(file) {
      png(file)
      print(plotInput())
      dev.off()
    })

обратите внимание, что у меня были некоторые проблемы с версией 0.3 shiny, но она работает с последней из Github:

library(devtools)
install_github("shiny","rstudio")

Это старый, но все еще Топ-Хит, когда кто-то googles "R shiny save ggplot", поэтому я внесу еще один обходной путь. Очень просто... вызовите ggsave в той же функции, которая отображает ваш график, который сохранит график в виде файла на сервере.

output$plot <- renderPlot({
    ggsave("plot.pdf", plotInput())
    plotInput()
})

затем используйте downloadHandler и используйте file.copy() для записи данных из существующего файла в параметр "file".

output$dndPlot <- downloadHandler(
    filename = function() {
        "plot.pdf"
    },
    content = function(file) {
        file.copy("plot.pdf", file, overwrite=TRUE)
    }
)

работает для меня.