【问题标题】:How can I use observer to export a plot?如何使用观察者导出绘图?
【发布时间】:2015-01-08 21:12:09
【问题描述】:

我制作了一个小应用程序来尝试学习使用闪亮将绘图导出到文件。目前我正在尝试使用观察者,并且我已经成功地导出了图,但不是以我想要的方式。在大多数情况下,我制作了这个应用程序,复制了闪亮画廊中的观察者演示,并更新以尝试制作 pdf。 UI 只有两个操作按钮(input$ex 和 input$plot)和一个用于更改样本大小的滑块。它输出两个随机法线相互对比的图。我尝试使用以下代码输出绘图。

pdf.check<-reactive({
    #'this should change when you hit the plot button, or when you change the sample size,
    #'but not when you hit the export button. Whenever you hit the export button
    #'pdf.check!=input$ex
    input$n
    input$plot
    isolate({input$ex})
  })
  obs <- observer({
    if(input$ex>0 & input$ex!=isolate({pdf.check()})){
      #'when you hit the export button, this should start a pdf.  it shouldn't do it
      #'for any other input, or when you open the app
      pdf(file=logfilename, width=6, height = 5)
    }
    #'I included the input$plot to make this run whenever you hit the plot button, and
    #'it should just be making these graphs.
    input$plot
    #'isolated input$n so this code doesn't run when you change n
    isolate({plot(rnorm(input$n), rnorm(input$n), pch=20, xlab="X", ylab = "Y", main= input$plot)})

  })

这实际上是在我每次点击绘图按钮时导出为 pdf,但在我移动 n 滑块后它不会再导出。此外,如果我已经移动了 n 滑块,我必须按两次导出按钮才能启动 pdf。我对观察者的了解不够,无法知道我做错了什么。

我遇到的另一个问题是应用程序在关闭时无法运行dev.off()。我可以包含一些手动运行dev.off() 的内容,但如果有人不小心关闭了应用程序而没有这样做,我希望 pdf 仍然关闭。我尝试使用以下内容。

  session$onSessionEnded(function() {
    dev.off()
    unlink(logfilename)
  })

老实说,我对观察者仍然很缺乏经验,而且我不完全确定我理解它是如何运作的。任何可以提供的帮助将不胜感激。

【问题讨论】:

    标签: r pdf-generation shiny


    【解决方案1】:

    您需要做的是将绘图函数包装在下载处理程序中,而不是在您的数据中。像这样,observer() 是创建绘图的函数:

    output$downloadPlot <- downloadHandler(
        filename = function() {paste0(input$plot, ".pdf")},
        content = function(file) {
          pdf(file, width=8.5, height=5)
          observer()
          dev.off()      
        })
    

    然后回到用户界面,您可以添加一个用于下载绘图的按钮(与仅在屏幕上显示绘图不同)。

    downloadButton("downloadPlot", label="Download Plot")
    

    【讨论】:

    • 我之前已经成功地能够使用下载处理程序下载单个图。我在这里要做的是下载一个包含许多绘图的文件,类似于pdf() 函数在常规 R 控制台中的工作方式。我现在要试试这个,但我担心我一次只能得到一个情节。
    • edit:我只是理解观察者是一个函数的东西,感觉像个白痴。这应该可行,我只需要想出某种方法来快速重现我的函数所做的所有图。
    猜你喜欢
    • 1970-01-01
    • 2017-05-23
    • 2014-08-12
    • 1970-01-01
    • 1970-01-01
    • 2019-06-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多