Я пытаюсь понять, как использовать downloadButton для сохранения сюжета с помощью shiny. Пример в пакете демонстрирует downloadButton / downloadHandler для сохранения .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 не может использовать эту filename
функцию (я думаю). Если я использую стандартное графическое устройство (как показано ниже), оно Download Plot
работает без ошибок, но не записывает графику.
Будем признательны за любые советы по работе с downloadHandler для написания графиков.
ggsave(file, plotInput(), device = png)
вместо создания функции устройства (оболочки).Вот решение, которое позволяет использовать ggsave для сохранения блестящих участков. Он использует логический флажок и текстовый ввод для вызова
ggsave()
. Добавьте это вui.R
файл внутриsidebarPanel
:textInput('filename', "Filename"), checkboxInput('savePlot', "Check to save")
Затем добавьте это в
server.R
файл вместо текущей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.
Пожалуйста, добавьте любые предложения, которые у вас могут быть
источник
isolate
блока вокругinput$filename
, любое изменение вfilename
текстовом поле также будет запрашивать сохранение файла, если этот флажок установлен.У меня не получилось заставить его работать
ggsave
, но со стандартным вызовомpng()
вроде нормально.Я изменил только
output$downloadPlot
часть вашегоserver.R
файла:output$downloadPlot <- downloadHandler( filename = function() { paste(input$dataset, '.png', sep='') }, content = function(file) { png(file) print(plotInput()) dev.off() })
Обратите внимание, что у меня были проблемы с версией shiny 0.3, но она работает с последней версией от Github:
library(devtools) install_github("shiny","rstudio")
источник
Это старый, но по-прежнему самый популярный вариант, когда кто-то набирает в Google «R shiny save ggplot», поэтому я предложу другой обходной путь. Очень просто ... вызовите ggsave в той же функции, которая отображает ваш график, которая сохранит график как файл на сервере.
output$plot <- renderPlot({ ggsave("plot.pdf", plotInput()) plotInput() })
Затем используйте downloadHandler и используйте
file.copy()
для записи данных из существующего файла в параметр «файл».output$dndPlot <- downloadHandler( filename = function() { "plot.pdf" }, content = function(file) { file.copy("plot.pdf", file, overwrite=TRUE) } )
Работает на меня.
источник