Estou tentando descobrir como usar o downloadButton para salvar um gráfico com brilho. O exemplo no pacote demonstra downloadButton / downloadHandler para salvar um .csv. Vou fazer um exemplo reproduzível com base nisso.
Para 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')
)
))
Para 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())
}
)
})
Se você está respondendo a esta pergunta, provavelmente está familiarizado com isso, mas para fazer isso funcionar, salve o acima em scripts separados ( ui.R
e server.R
em uma pasta ( foo
) dentro do diretório de trabalho. Para executar o aplicativo brilhante, execute runApp("foo")
.
Usando ggsave
, recebo uma mensagem de erro indicando que ggsave não pode usar a filename
função (eu acho). Se eu usar o dispositivo gráfico padrão (como abaixo), Download Plot
funciona sem erro, mas não grava o gráfico.
Quaisquer dicas para fazer o downloadHandler trabalhar para escrever plotagens serão apreciadas.
ggsave(file, plotInput(), device = png)
vez de criar uma função de dispositivo (invólucro).Aqui está uma solução que permite o uso de ggsave para salvar plotagens brilhantes. Ele usa uma caixa de seleção lógica e entrada de texto para chamar
ggsave()
. Adicione isso aoui.R
arquivo dentro desidebarPanel
:textInput('filename', "Filename"), checkboxInput('savePlot', "Check to save")
Em seguida, adicione isso ao
server.R
arquivo em vez daoutput$plot
função reactivePlot atual :output$plot <- reactivePlot(function() { name <- paste0(input$filename, ".png") if(input$savePlot) { ggsave(name, plotInput(), type="cairo-png") } else print(plotInput()) })
Um usuário pode então digitar o nome do arquivo desejado na caixa de texto (sem extensão) e marcar a caixa de seleção para salvar no diretório do aplicativo. Desmarcar a caixa imprime o gráfico novamente. Tenho certeza de que existem maneiras mais simples de fazer isso, mas pelo menos agora posso usar ggsave e cairo no Windows para obter gráficos PNG muito mais agradáveis.
Por favor, adicione qualquer sugestão que você possa ter.
fonte
isolate
bloco ao redor doinput$filename
, qualquer alteração nafilename
caixa de texto também solicitará um arquivo salvo se a caixa estiver marcada.Não consegui fazer funcionar com o
ggsave
, mas com uma chamada padrãopng()
parece estar tudo bem.Eu só mudei a
output$downloadPlot
parte do seuserver.R
arquivo:output$downloadPlot <- downloadHandler( filename = function() { paste(input$dataset, '.png', sep='') }, content = function(file) { png(file) print(plotInput()) dev.off() })
Observe que tive alguns problemas com a versão 0.3 do brilhante, mas funciona com a versão mais recente do Github:
library(devtools) install_github("shiny","rstudio")
fonte
Isso é antigo, mas ainda é o principal hit quando alguém digita "R bright save ggplot", então irei contribuir com outra solução alternativa. Muito simples ... chame ggsave na mesma função que exibe seu gráfico, o que salvará o gráfico como um arquivo no servidor.
output$plot <- renderPlot({ ggsave("plot.pdf", plotInput()) plotInput() })
Em seguida, use downloadHandler e use
file.copy()
para gravar os dados do arquivo existente no parâmetro "arquivo".output$dndPlot <- downloadHandler( filename = function() { "plot.pdf" }, content = function(file) { file.copy("plot.pdf", file, overwrite=TRUE) } )
Funciona para mim.
fonte