2016-11-29 151 views
4

我想下载Shiny App内的报告,其中包括Plotly图。 到目前为止,我还没有在stackoverflow上找到任何答案。 直到现在,我可以下载Plotly的屏幕截图,但它的只出现在我的工作目录,它不会发送到RmarkdownPlotly嵌入Shiny和RMarkdown

示例代码:

library(shiny) 
library(plotly) 
library(rsvg) 
library(ggplot2) 

d <- data.frame(X1=rnorm(50,mean=50,sd=10),X2=rnorm(50,mean=5,sd=1.5),Y=rnorm(50,mean=200,sd=25)) 

ui <-fluidPage(
    title = 'Download report', 
    sidebarLayout(

    sidebarPanel(
     helpText(), 
     radioButtons('format', 'Document format', c('PDF', 'HTML', 'Word'), 
        inline = TRUE), 
     downloadButton('downloadReport'), 
     tags$script(' 
        document.getElementById("downloadReport").onclick = function() { 
        var plotly_svg = Plotly.Snapshot.toSVG(
        document.querySelectorAll(".plotly")[0] 
       ); 

        Shiny.onInputChange("plotly_svg", plotly_svg); 
        }; 
        ') 
    ), 
    mainPanel(
     plotlyOutput('regPlot') 
    ) 
    ) 
) 

server <- function(input, output, session) { 

    output$regPlot <- renderPlotly({ 
    p <- plot_ly(d, x = d$X1, y = d$X2,mode = "markers") 
    p 
    }) 

    observeEvent(input$plotly_svg, priority = 10, { 
    png_gadget <- tempfile(fileext = ".png") 
    png_gadget <- "out.png" 
    print(png_gadget) 
    rsvg_png(charToRaw(input$plotly_svg), png_gadget) 
    }) 

    output$downloadReport <- downloadHandler(
    filename = function() { 
     paste('my-report', sep = '.', switch(
     input$format, PDF = 'pdf', HTML = 'html', Word = 'docx' 
    )) 
    }, 

    content = function(file) { 
     src <- normalizePath('testreport.Rmd') 

     owd <- setwd(tempdir()) 
     on.exit(setwd(owd)) 
     file.copy(src, 'testreport.Rmd') 

     library(rmarkdown) 
     out <- render('testreport.Rmd', params = list(region = "Test"), switch(
     input$format, 
     PDF = pdf_document(), HTML = html_document(), Word = word_document() 
    )) 
     file.rename(out, file) 
    } 
) 
} 

shinyApp(ui = ui, server = server) 

和testreport.Rmd文件:

--- 
title: "test" 
output: pdf_document 
params: 
    name: "Test" 
    region: 'NULL' 
--- 

```{r setup, include=FALSE} 
knitr::opts_chunk$set(echo = TRUE) 
``` 

任何帮助,将不胜感激,因为没有很多资源和文档约R Plotly

干杯

+0

你想在剧情里面阴谋吗?或者你想下载一些东西进入Rmd?我很困惑,“直到现在我能够下载Plotly的屏幕截图,但它只出现在我的工作目录中,并且它不会被发送到Rmarkdown” – Llopis

+0

我想从报告文件里闪亮的应用程序进行剧情截图(rmarkdown ) –

+0

我不知道如何积极工作,但一旦你有图像为什么你不能使用这个[解决方案](http://stackoverflow.com/a/25167279/2886003)?或者通过截图来表示用于生成此类图像的代码?在后面的例子中,你是否厌倦将代码包含在一个块中? – Llopis

回答

1

如果out.png下载到您的工作目录,你可以修改你的downloadHandlercontent功能将其移动到临时目录,并将其添加到报告:

content = function(file) { 
     temp_dir <- tempdir() 
     tempReport <- file.path(temp_dir, 'testreport.Rmd') 
     tempImage <- file.path(temp_dir, 'out.png') 
     file.copy('testreport.Rmd', tempReport, overwrite = TRUE) 
     file.copy('out.png', tempImage, overwrite = TRUE) 

     library(rmarkdown) 
     out <- render(tempReport, params = list(region = "Test"), switch(
     input$format, 
     PDF = pdf_document(), HTML = html_document(), Word = word_document() 
    )) 
     file.rename(out, file) 
    } 

testreport.Rmd可能看起来像(更信息here):

--- 
title: "test" 
--- 

Here's the plot image. 

![Plot image](out.png) 

你也可以通过你的plotly函数的参数在你的功能解释为here并使用参数化的Rmarkdown文件,但这只适用于Html报告。

+0

这是一个有趣的方法,但是如果我放大'plotly'情节在闪亮的应用程序中,报告只显示主要情节(无缩放)..我想反映所有已经做出的行动在shiy' plotly'..What其实奇怪我的图像'out.png'出现在我的工作目录,它适当放大,并回应所有采取闪亮'plotly'情节的行动... –

+1

好点,目录没有切换回初始工作目录,所以它只是重新复制临时目录中的文件,我更改了“内容”代码,现在应该可以正常工作。 – NicE

+0

好!!谢谢!它工作完美! “情节剧”颇为麻烦 –

0

根据您想有多深潜入这一点,我建议建立与闪亮的代码.brew文件,比你可以有你的用户信息发送到BREW文件并创建情节。这会给你一个静态代码文件,每次都会用新数据动态更新。唯一的缺点是,当您对闪亮进行更改时,必须对brew文件进行相同的更改。另一种选择是使用新的RStudio 1.0创建一个带有rmarkdown的Flex仪表板,它变成一个html文件。 查看(Create parametric R markdown documentation?)的酿造示例。