Сохранение участков, сделанных в блестящем приложении
Я пытаюсь выяснить, как использовать кнопку загрузки, чтобы сохранить сюжет с блестящим. Пример в пакете демонстрирует 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 ответа:
не уверен, что этот вопрос все еще активен, но это первый, который появился при поиске "сохранение участков в блестящем приложении", поэтому я хотел быстро добавить, как заставить 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) } )
работает для меня.