保存在一个shiny的应用程序进行绘图

我想弄清楚如何使用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.Rserver.R放到工作目录中的文件夹( foo )中。应用程序,运行runApp("foo")

使用ggsave ,我得到一个错误消息,指出ggsave不能使用filenamefunction(我认为)。 如果我使用标准的graphics设备(如下图), Download Plot工作没有错误,但它不写入graphics。

任何获得downloadHandler写作地块的提示将不胜感激。

不知道这个问题是否仍然活跃,但这是第一个search“保存在shiny的应用程序中的情节”,所以我想快速添加如何让ggsave与downloadHandler一起工作的原始问题的线条。

由朱巴使用直接输出,而不是ggsave和替代策略build议由alexwhan自己的两个工作很好,这是只为那些谁想要在downloadHandler中使用ggsave)的替代策略。

由alexwhan报告的问题是由ggsave试图将文件扩展名匹配到正确的graphics设备。 但临时文件没有扩展名,所以匹配失败。 这可以通过在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内部分配的pngdevice函数(你可以看看ggsave函数代码来查看jpgpdf等的语法)。 也许,理想情况下,可以指定文件扩展名(如果与文件名不同,就像这里的临时文件一样)作为ggsave参数,但是这个选项目前在ggsave不可用。


最小的独立工作示例:

 library(shiny) library(ggplot2) runApp(list( ui = fluidPage(downloadButton('foo')), server = function(input, output) { plotInput = function() { qplot(speed, dist, data = cars) } output$foo = downloadHandler( filename = 'test.png', content = function(file) { device <- function(..., width, height) { grDevices::png(..., width = width, height = height, res = 300, units = "in") } ggsave(file, plot = plotInput(), device = device) }) } )) sessionInfo() # R version 3.1.1 (2014-07-10) # Platform: x86_64-pc-linux-gnu (64-bit) # # locale: # [1] LC_CTYPE=en_US.UTF-8 LC_NUMERIC=C # [3] LC_TIME=en_US.UTF-8 LC_COLLATE=en_US.UTF-8 # [5] LC_MONETARY=en_US.UTF-8 LC_MESSAGES=en_US.UTF-8 # [7] LC_PAPER=en_US.UTF-8 LC_NAME=C # [9] LC_ADDRESS=C LC_TELEPHONE=C # [11] LC_MEASUREMENT=en_US.UTF-8 LC_IDENTIFICATION=C # # attached base packages: # [1] stats graphics grDevices utils datasets methods base # # other attached packages: # [1] ggplot2_1.0.0 shiny_0.10.1 # # loaded via a namespace (and not attached): # [1] bitops_1.0-6 caTools_1.17 colorspace_1.2-4 digest_0.6.4 # [5] formatR_1.0 grid_3.1.1 gtable_0.1.2 htmltools_0.2.6 # [9] httpuv_1.3.0 labeling_0.2 MASS_7.3-34 munsell_0.4.2 # [13] plyr_1.8.1 proto_0.3-10 Rcpp_0.11.2 reshape2_1.4 # [17] RJSONIO_1.3-0 scales_0.2.4 stringr_0.6.2 tools_3.1.1 # [21] xtable_1.7-3 

更新

从ggplot2版本2.0.0开始, ggsave函数支持device参数的字符input,这意味着downloadHandler创build的临时文件现在可以通过直接调用ggsave来保存, ggsave是指定要使用的扩展名应该是"pdf" (而不是传递设备function)。 这简化了以上的例子

 output$downloadPlot <- downloadHandler( filename = function() { paste(input$dataset, '.png', sep='') }, content = function(file) { ggsave(file, plot = plotInput(), device = "png") } ) 

这是一个解决scheme,允许使用ggsave来保存有光泽的地块。 它使用逻辑checkbox和文本input来调用ggsave() 。 将此添加到ui.R中的ui.R文件中:

 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()) }) 

用户可以在文本框中input所需的文件名(没有扩展名),勾选checkbox保存在应用程序目录中。 取消选中该框会再次打印该图。 我敢肯定有这样做的完美方式,但至less我现在可以在Windows中使用ggsave和cairo来获得更好的pnggraphics。

请添加您可能有的任何build议。

我没有设法使它与ggsave一起工作,但是对png()的标准调用似乎没有问题。

我只改变了server.R文件的output$downloadPlot部分:

  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闪存保存ggplot”,所以我会提供另一个解决方法。 非常简单…在显示graphics的相同函数中调用ggsave,这将把graphics保存为服务器上的文件。

 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) } ) 

为我工作。