Plotly嵌入Shiny和RMarkdown中

时间:2016-11-29 10:50:29

标签: r shiny plotly

我想在Shiny App中下载报告,其中包含Plotly图表。 到目前为止,我还没有在stackoverflow上找到任何答案。 到目前为止,我可以下载Plotly的屏幕截图,但仅出现在我的工作目录中,并且不会发送到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的资料和文档不多。

干杯

2 个答案:

答案 0 :(得分:1)

如果将out.png下载到您的工作目录,您可以修改content的{​​{1}}功能,将其移至临时目录并将其添加到报告中:

downloadHandler

您的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) } 看起来像(更多信息here):

testreport.Rmd

您还可以在--- title: "test" --- Here's the plot image. ![Plot image](out.png) 函数的render中传递您的情节函数的参数,如解释here并使用参数化的Rmarkdown文件,但这仅适用于Html报告。< / p>

答案 1 :(得分:0)

根据您想深入了解的深度,我建议您使用闪亮的代码创建.brew文件,然后您可以让用户将信息发送到brew文件并创建绘图。这将为您提供一个静态代码文件,每次都会使用新数据动态更新。唯一的缺点是,当您对闪亮进行更改时,您必须对brew文件进行相同的更改。另一种选择是使用新的RStudio 1.0创建一个带有rmarkdown的flex仪表板,它成为一个html文件。 请参阅(Create parametric R markdown documentation?)了解brew示例。