我想知道如何使用downloadButton保存一个有光泽的绘图.包中的示例演示了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)中.要运行shiny 的应用程序,请运行runApp("foo").

使用ggsave,我会收到一条错误消息,表明ggsave不能使用filename函数(我想).如果我使用标准图形设备(如下所示),Download Plot可以正常工作,但不会写入图形.

任何让downloadHandler编写情节的建议都将不胜感激.

推荐答案

不确定这个问题是否仍处于活动状态,但这是搜索"在shiny 的应用程序中保存情节"时出现的第一个问题,因此我想快速添加如何让ggsave与downloadHandler一起使用,与原始问题相同.

juba建议的替代策略使用直接输出而不是ggsave,alexwhan建议的替代策略都非常有效,这只适用于那些绝对想在下载处理程序中使用ggsave的人).

alexwhan报告的问题是由ggsave试图将文件扩展名与正确的图形设备匹配引起的.但是,临时文件没有扩展名,因此匹配失败.这可以通过在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)
    }
)

这个调用基本上将device函数用于ggsave内部分配的png(您可以查看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    

Update

从ggplot2 2.0.0版开始,ggsave函数支持device参数的字符输入,这意味着downloadHandler创建的临时文件现在可以通过直接调用ggsave来保存,方法是指定要使用的扩展名应为"pdf"(而不是传入设备函数).这将上述示例简化为以下内容

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

R相关问答推荐

如何创建对角线上的载体为1的矩阵?

在R中,将一个函数作为输入传递给另一个函数时进行参数判断

工作流程_set带有Dplyrr风格的 Select 器,用于 Select 结果和预测因子R

为什么st_join(ob1,ob2,left = True)返回具有比ob1更多功能的sf对象?

抖动点与嵌套类别变量箱形图的位置不对齐

如何使用按钮切换轨迹?

在连续尺度上转置标签[瀑布图,R]

如何优化向量的以下条件赋值?

par函数中的缩写,比如mgp,mar,mai是如何被破译的?

如果某些列全部为NA,则更改列

如何在PackageStatus()中列出&q;不可用的包&q;?

如何将网站图像添加到带有极坐标的面包裹条形图?

根据列表中项目的名称合并数据框和列表

将标识符赋给事件序列,避免错误观察

列名具有特殊字符时的循环回归

正则表达式在第二个管道和第二个T之后拆分R中的列

将多个变量组合成宽格式

将多个列合并为一个列的有效方法是什么?

使用ifElse语句在ggploy中设置aes y值

如何使投篮在R中保持一致