首页 文章

保存在闪亮的应用程序中制作的情节

提问于
浏览
72

我正在试图弄清楚如何使用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 ) . 要运行闪亮的应用程序,请运行 runApp("foo") .

使用 ggsave ,我收到一条错误消息,指出ggsave无法使用 filename 函数(我认为) . 如果我使用标准图形设备(如下所示), Download Plot 可以正常工作,但它不会写入图形 .

任何提示下载处理程序工作用于编写图表的任何提示将不胜感激 .

4 回答

  • 20

    这是旧的,但当有人谷歌“R闪亮保存ggplot”时仍然是最受欢迎的,所以我将贡献另一种解决方法 . 非常简单...在显示图形的同一函数中调用ggsave,这将把图形保存为服务器上的文件 .

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

    适合我 .

  • 22

    不确定这个问题是否仍然有效,但它是第一个在搜索“在闪亮的应用程序中保存情节”时出现的问题,因此我想快速添加如何让ggsave与原始问题的行一起使用downloadHandler .

    juba提出的替代策略使用直接输出而不是ggsave和alexwhan自己建议的替代策略都很有效,这只适用于那些绝对想在downloadHandler中使用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 函数为 png 内部 ggsave 分配(您可以查看 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 参数的字符输入,这意味着现在可以通过指定要使用的扩展名为例如直接调用_487123来保存downloadHandler创建的临时文件 . "pdf" (而不是传入设备功能) . 这将以上示例简化为以下内容

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

    这是一个允许使用ggsave来保存闪亮图的解决方案 . 它使用逻辑复选框和文本输入来调用 ggsave() . 将其添加到 sidebarPanel 内的 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())
      })
    

    然后,用户可以在文本框中键入所需的文件名(不带扩展名),勾选复选框以保存在app目录中 . 取消选中该框会再次打印该图 . 我确信有更简洁的方法可以做到这一点,但至少我现在可以在windows中使用ggsave和cairo来获得更好的png图形 .

    请添加您的任何建议 .

  • 17

    我没有设法使它与 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()
        })
    

    请注意,我在0.3版本的闪亮版中遇到了一些问题,但它与Github的最新版本一起使用:

    library(devtools)
    install_github("shiny","rstudio")
    

相关问题