Próbuję dowiedzieć się, jak użyć downloadButton, aby zapisać działkę z błyszczącym. Przykład w pakiecie demonstruje metodę downloadButton / downloadHandler, aby zapisać plik .csv. Na tej podstawie stworzę powtarzalny przykład.
Dla 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')
)
))
Dla 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())
}
)
})
Jeśli odpowiadasz na to pytanie, prawdopodobnie znasz to, ale aby to zadziałało, zapisz powyższe w osobnych skryptach ( ui.R
i server.R
w folderze ( foo
) w katalogu roboczym. Aby uruchomić błyszczącą aplikację, uruchom runApp("foo")
.
Używając ggsave
, otrzymuję komunikat o błędzie wskazujący, że ggsave nie może użyć filename
funkcji (tak mi się wydaje). Jeśli korzystam ze standardowego urządzenia graficznego (jak poniżej), to Download Plot
działa bezbłędnie, ale nie pisze grafiki.
Wszelkie wskazówki dotyczące tego, aby downloadHandler pracował nad pisaniem fabuł, byłyby mile widziane.
ggsave(file, plotInput(), device = png)
zamiast tworzenia funkcji urządzenia (opakowania).Oto rozwiązanie, które pozwala używać ggsave do zapisywania błyszczących działek. Do wywołania używa logicznego pola wyboru i wprowadzania tekstu
ggsave()
. Dodaj to doui.R
pliku w środkusidebarPanel
:textInput('filename', "Filename"), checkboxInput('savePlot', "Check to save")
Następnie dodaj to do
server.R
pliku zamiast bieżącejoutput$plot
funkcji reactivePlot:output$plot <- reactivePlot(function() { name <- paste0(input$filename, ".png") if(input$savePlot) { ggsave(name, plotInput(), type="cairo-png") } else print(plotInput()) })
Użytkownik może następnie wpisać żądaną nazwę pliku w polu tekstowym (bez rozszerzenia) i zaznaczyć pole wyboru, aby zapisać w katalogu aplikacji. Odznaczenie pola powoduje ponowne wydrukowanie wykresu. Jestem pewien, że są lepsze sposoby na zrobienie tego, ale przynajmniej mogę teraz używać ggsave i cairo w oknach, aby uzyskać znacznie ładniejszą grafikę png.
Dodaj wszelkie sugestie, które możesz mieć.
źródło
isolate
bloku wokółinput$filename
, każda zmiana wfilename
polu tekstowym będzie również powodować monit o zapisanie pliku, jeśli pole jest zaznaczone.Nie udało mi się z tym zrobić
ggsave
, ale przy standardowym wywołaniupng()
wydaje się być w porządku.Zmieniłem tylko
output$downloadPlot
część twojegoserver.R
pliku:output$downloadPlot <- downloadHandler( filename = function() { paste(input$dataset, '.png', sep='') }, content = function(file) { png(file) print(plotInput()) dev.off() })
Zauważ, że miałem trochę problemów z wersją Shiny w 0.3, ale działa z najnowszą wersją Githuba:
library(devtools) install_github("shiny","rstudio")
źródło
To jest stare, ale nadal jest hitem, gdy ktoś wygoogluje „R shiny save ggplot”, więc przedstawię inne obejście. Bardzo proste ... wywołaj ggsave w tej samej funkcji, która wyświetla wykres, co zapisze wykres jako plik na serwerze.
output$plot <- renderPlot({ ggsave("plot.pdf", plotInput()) plotInput() })
Następnie użyj downloadHandler i użyj,
file.copy()
aby zapisać dane z istniejącego pliku do parametru „plik”.output$dndPlot <- downloadHandler( filename = function() { "plot.pdf" }, content = function(file) { file.copy("plot.pdf", file, overwrite=TRUE) } )
Pracuje dla mnie.
źródło