我想在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
的资料和文档不多。
干杯
答案 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示例。