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

时间:2016-02-08 19:56:54

标签: r shiny-server shiny shinydashboard

请考虑以下事项:

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

2 个答案:

答案 0 :(得分:1)

不要让plotInput成为一个函数,而是尝试将其变成&#34;被动&#34;。 Shiny应该检测到打印到文件时,如果没有任何输入发生变化,则无需重新运行被动反应,因此renderPlot和pdf应该使用相同的图

答案 1 :(得分:0)

我通过生成静态pdf图解决了它,我使用.png转换为ImageMagick并使用renderImage

将转换后的图像渲染到浏览器
# 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)
      }
    )