Enregistrer des parcelles faite dans un brillant app
Je suis à essayer de comprendre comment utiliser downloadButton pour enregistrer une intrigue avec des brillants. L'exemple dans le paquet montre downloadButton/downloadHandler pour enregistrer un .csv. Je vais faire un exemple reproductible sur cette base.
Pour 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')
)
))
Pour 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())
}
)
})
Si vous êtes de répondre à cette question, vous êtes probablement familier avec cela, mais pour obtenir ce travail, enregistrez le ci-dessus dans des scripts séparés (ui.R
et server.R
dans un dossier (foo
) dans le répertoire de travail. Pour exécuter la brillante application, exécutez runApp("foo")
.
À l'aide de ggsave
, je reçois un message d'erreur indiquant que ggsave ne pouvez pas utiliser la filename
fonction (je crois). Si j'utilise le standard de périphérique graphique (comme ci-dessous), le Download Plot
fonctionne sans erreur, mais il n'a pas d'écrire le graphique.
Des conseils pour obtenir downloadHandler de travail pour la rédaction des parcelles serait appréciée.
Vous devez vous connecter pour publier un commentaire.
Ne sais pas si cette question est toujours actif, mais c'est la première qui m'est venue lors de la recherche pour "sauver les parcelles de shiny app" donc je voulais ajouter rapidement comment obtenir ggsave de travailler avec downloadHandler le long de la lignes de la question d'origine.
Les stratégies alternatives suggérées par juba à l'aide de la sortie directe au lieu de ggsave et stratégie alternative suggérée par alexwhan lui-même à la fois de l'excellent travail, c'est juste pour ceux qui veulent absolument utiliser ggsave dans le downloadHandler).
Le problème signalé par alexwhan est causée par ggsave d'essayer de faire correspondre l'extension du fichier pour le graphique correcte de l'appareil. Le fichier temporaire, cependant, n'a pas une extension si l'appariement échoue. Cette situation peut être corrigée par spécifiquement réglage de l'appareil dans le
ggsave
appel de fonction, comme dans le code d'origine par exemple (png):Cet appel prend la
device
pour une fonction depng
queggsave
attribue à l'interne (vous pouvez regarder leggsave
code de la fonction pour voir la syntaxe dejpg
,pdf
, etc). Peut-être, dans l'idéal, on pourrait préciser l'extension de fichier (si différent du nom de fichier - comme c'est le cas ici pour le fichier temporaire) comme unggsave
paramètre, mais cette option n'est pas disponible actuellement dansggsave
.Un minimum autonome de travail exemple:
Mise à jour
De ggplot2 de la version 2.0.0, le
ggsave
fonction prend en charge la saisie de caractères pour ledevice
paramètre, cela signifie que le fichier temporaire créé par le downloadHandler peuvent désormais être enregistrés avec un appel direct àggsave
en précisant que l'extension doit être par exemple"pdf"
(plutôt que de passer dans un fonctionnement de l'appareil). Cela simplifie l'exemple ci-dessus à la suite deggsave(file, plotInput(), device = png)
au lieu de créer un dispositif (wrapper) de la fonction.png
de la fonction deunits
paramètre par défaut est "px"). Pour une solution générale à cette question, il y a un pull request pour une fonctionnalité qui permettraitggsave(... device="png")
comme un moyen facile d'avoirggsave
spécifiquement choisir ses propres png wrapper.lastPlot()
vraiment sauve la journée!Voici une solution qui permet d'utiliser ggsave pour sauver brillant parcelles. Il utilise une logique case de saisie de texte pour appeler
ggsave()
. Ajoutez à cela leui.R
fichier à l'intérieur desidebarPanel
:Puis l'ajouter à la
server.R
fichier au lieu de l'actueloutput$plot
reactivePlot fonction:Un utilisateur peut ensuite tapez le nom de fichier souhaité dans la zone de texte (sans l'extension) et cochez la case pour enregistrer dans le répertoire app. Décocher la case imprime le tracer à nouveau. Je suis sûr qu'il ya plus propres façons de le faire, mais au moins je peux maintenant utiliser ggsave et au caire dans windows pour beaucoup plus agréable les images png.
S'il vous plaît ajouter toutes les suggestions que vous pourriez avoir.
isolate
bloc autour de lainput$filename
, toute modification de lafilename
zone de texte incitera également un fichier de l'enregistrement si la case est cochée.Je n'ai pas réussi à le faire fonctionner avec
ggsave
, mais avec un standard d'appel àpng()
il semble être bon.J'ai seulement changé la
output$downloadPlot
partie de votreserver.R
fichier :Noter que j'ai eu quelques problèmes avec la version 0.3 de brillant, mais il fonctionne avec la dernière à partir de Github :
C'est vieux, mais toujours le top hit quand quelqu'un googles "R brillant enregistrer ggplot", je vais donc contribuer autre solution de contournement. Très simple... appel ggsave dans la même fonction qui permet d'afficher votre graphique, qui va enregistrer le graphique dans un fichier sur le serveur.
Ensuite, utilisez downloadHandler et l'utilisation
file.copy()
pour écrire des données depuis le fichier existant à la "fichier" paramètre.Fonctionne pour moi.