同时在静态函数上使用 downloadHandler 和 renderPlot

using downloadHandler and renderPlot on a static function simultaneously

请考虑以下事项:

# createPlot takes in data, processes it and generates a plot using native plot()
    plotInput <- function(){       
     createPlot(data=data(),name=input$name)
    }

# I render it using
output$plot <- renderPlot({
    plotInput()
  }, height=700,width=850,res=100)

# and I download the pdf using
output$pdflink <- downloadHandler(
      filename <- "plot.pdf",
      content <- function(file){
        pdf("plot.pdf")
        print(plotInput())
        dev.off()
        file.copy("plot.pdf", file)
      }
  )

createPlot 函数有一个 randomising 因子,它用一个小的随机伪计数填充空值。因此,每当此函数为 运行 时,绘图上的点并不完全相同,因此下载的绘图与我在界面上看到的有点不同。我该怎么做才能解决这个问题?

我试过将 plotInput() 的输出存储到一个静态变量中,并重新使用该变量进行渲染和导出,但它不是这样工作的。

mainPlot <- plotInput()

与其将 plotInput 设为函数,不如将其设为 "reactive"。 Shiny 应该检测到当打印到文件时,如果 none 的输入已经改变,则不需要重新运行反应,因此 renderPlot 和 pdf 应该使用相同的 plot

我通过生成静态 pdf 图解决了这个问题,我使用 ImageMagick 将其转换为 .png,并使用 renderImage[=14= 将转换后的图像渲染到浏览器]

# createPlot takes in data, processes it and generates a plot using native plot()
    plotInput <- reactive({       
     createPlot(data=data(),name=input$name)
    })

# I render it using
    output$plot <- renderImage({
     pdf("plot.pdf")
     print(plotInput())
     dev.off
# R wrapper for imagemagick
   im.convert('plot.pdf',output='plot.png',extra.opts="-density 250 -quality 100")
    list(src='plot.png',
     contentType='image/png',
     alt='emptyPlot')
   },deleteFile=FALSE)

# and I download the pdf using
    output$pdflink <- downloadHandler(
      filename <- "plot.pdf",
      content <- function(file){
        file.copy("plot.pdf", file)
      }
    )