在Shiny中下载Pdf报告

时间:2017-09-28 14:33:15

标签: r pdf shiny r-markdown

我制作一个闪亮的应用程序,将创建2个图和一个表。

选择输入部分有很多选项。

一旦被选中,它将对data.frame进行子集化并返回另一个data.frame进行分析。

它会相应地进行绘图,我希望它以pdf(或html)生成一个包含输入详细信息的报告。

喜欢"生成报告"按钮,并为我提供该特定输入的图表以及输入的$ company.pdf(或html)名称。

我到处搜索,我无法知道如何做到这一点。

我还想将.Rmd编辑为更好的格式。 只有一些短语可供介绍等等。

这是我的详细信息。

所有代码

library(ggplot2)
library(prophet)
library(markdown)
library(knitr)
order <- read.csv("order.csv" , header = T, sep = ",", stringsAsFactors = F)

order$Date <- strftime(order$Date.added, format = "%Y-%m-%d")
order$Date <- as.Date(order$Date)
order$Payment.company <- as.character(order$Payment.company)

choices <- sort(unique(as.character(order$Payment.company)))





ui <- shinyUI(fluidPage(

        headerPanel("Company Order Analytics"),

        sidebarPanel(position = "left",
                     selectInput("company", "Select Company:", 
                                 choices = choices, selected = "A&E Scientific sprl", multiple = FALSE),
                     submitButton("Run"),

                     downloadButton("report", "Generate report"),


                     mainPanel(position="right",
                               tabsetPanel(
                                       tabPanel("Plot",  plotOutput("plot")),
                                       tabPanel("Table", tableOutput("table")),
                                       tabPanel("Graphic",  plotOutput("plot1"))
                               )))))

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

        plot1 <- reactive({

                a <- subset(order, order$Payment.company == input$company)
                a$l <- log10(a$Total)
                m <- subset(a, select=c("Total", "Date"))
                colnames(m) <- c("y", "ds")
                z <- prophet(m)
                future <- make_future_dataframe(z, periods = 365)
                forecast <- predict(z, future)
                plot(z, forecast, xlab = "Date", ylab = "Value Order GBP")



        })
        plot2 <- reactive({
                a <- subset(order, order$Payment.company == input$company)
                a$l <- log10(a$Total)
                m <- subset(a, select=c("Total", "Date"))
                colnames(m) <- c("y", "ds")
                z <- prophet(m, yearly.seasonality = TRUE)
                future <- make_future_dataframe(z, periods = 365)
                forecast <- predict(z, future)
                prophet_plot_components(z, forecast)


        })

        table1 <- reactive({

                a <- subset(order, order$Payment.company == input$company)
                n <- nrow(a)
                ma <- max(a$Total)
                x  <- median(a$Total)
                t <- sum(a$Total)

                tbl1 <- data.frame("Orders"= n, "Max"=ma, "Median"=x, "Total"=t)
                return(tbl1)

        }
        )

        output$plot <- renderPlot(plot1(),width = 850, height = 425)
        output$plot1 <- renderPlot(plot2(),width = 850, height = 425)
        output$table <- renderTable(table1())

        output$report <- downloadHandler(
                # For PDF output, change this to "report.pdf"
                filename = "report.html",
                content = function(file) {
                        before processing it, in
                        .
                        tempReport <- file.path(tempdir(), "report.Rmd")
                        file.copy("report.Rmd", tempReport, overwrite = TRUE)




                        rmarkdown::render(tempReport, output_file = file,
                                          params = params,
                                          envir = new.env(parent = globalenv())
                        )
                }
        )


                })

R markdown命名为report_file.Rmd

---
title: "Parameterized Report for Shiny"
output: pdf_document
params:
  table: 'NULL'
  plot: 'NULL'
---

```{r}
params[["plot"]]
```

```{r}
params[["plot1"]]
```

```{r}
params[["table"]]
```

UI和服务器都在一个.R文件上,.Rmd在不同的文档中。

我已拆分用户界面和服务器并已发布但仍然出错。

我的R非常绿,有光泽,但我试着通过反复试验来学习。但在这里,我完全陷入困境。

我只是想让它返回一个布置得很好的文件

这是我的会议:

sessionInfo()
R version 3.4.0 (2017-04-21)
Platform: x86_64-w64-mingw32/x64 (64-bit)
Running under: Windows >= 8 x64 (build 9200)

Matrix products: default

locale:
[1] LC_COLLATE=English_United States.1252  LC_CTYPE=English_United States.1252   
[3] LC_MONETARY=English_United States.1252 LC_NUMERIC=C                          
[5] LC_TIME=English_United States.1252    

attached base packages:
[1] stats     graphics  grDevices utils     datasets  methods   base     

other attached packages:
[1] bindrcpp_0.2  knitr_1.17    markdown_0.8  prophet_0.2   Rcpp_0.12.12  ggplot2_2.2.1
[7] shiny_1.0.5  

loaded via a namespace (and not attached):
 [1] compiler_3.4.0       plyr_1.8.4           bindr_0.1            bitops_1.0-6        
 [5] tools_3.4.0          digest_0.6.12        evaluate_0.10.1      jsonlite_1.5        
 [9] tibble_1.3.4         gtable_0.2.0         pkgconfig_2.0.1      rlang_0.1.2         
[13] yaml_2.1.14          gridExtra_2.2.1      extraDistr_1.8.7     stringr_1.2.0       
[17] dplyr_0.7.3          tidyselect_0.2.0     stats4_3.4.0         rprojroot_1.2       
[21] grid_3.4.0           glue_1.1.1           inline_0.3.14        R6_2.2.2            
[25] rmarkdown_1.6        rstan_2.16.2         RJSONIO_1.3-0        purrr_0.2.3         
[29] tidyr_0.7.1          magrittr_1.5         backports_1.1.0      scales_0.5.0        
[33] codetools_0.2-15     htmltools_0.3.6      StanHeaders_2.16.0-1 rsconnect_0.8.5     
[37] assertthat_0.2.0     mime_0.5             xtable_1.8-2         colorspace_1.3-2    
[41] httpuv_1.3.5         labeling_0.3         stringi_1.1.5        RCurl_1.95-4.8      
[45] lazyeval_0.2.0       munsell_0.4.3   

提前感谢所有帮助的人。有些英雄不穿斗篷。

最佳

1 个答案:

答案 0 :(得分:0)

为什么将图作为参数传递可能会失败

对于ggplots和其他特殊的图类型,可以将图保存为变量,但对于通常由plot()函数生成的更通用的“基本图”而言则不行。换句话说,plot()的返回值没有意义,因为绘制该图是函数的副作用。

x <- plot(1:10)
x
#> NULL

因此,有必要将这些副作用“传递”到rmarkdown报告而不是返回值。

解决方法:功能

传递副作用的一种方法是函数。为此,首先要定义一个绘制曲线的函数。然后将新定义的函数作为参数传递给Rmd文档

draw_plot <- function() {
  plot(1:10)
}
rmarkdown::render(
  "template.Rmd",
  params = list(draw_plot = draw_plot)
)

现在可以在Rmd文档中调用该函数,并且绘图将在那里(重新)绘制。一般来说,可以将任何R对象作为参数传递到parameterized reports中,对于这样的用例,函数(闭包)是非常灵活的对象类型。

尽可能传递对象

但是请注意,某些绘图库确实允许将绘图存储在变量中。在这些情况下,不需要功能。您只需要传递生成图的函数的返回对象即可。

library(ggplot2)

gg <- ggplot(mtcars, aes(wt, mpg)) + geom_point()
class(gg)
#> [1] "gg"     "ggplot"

rmarkdown::render(
  "template.Rmd",
  params = list(plot_object = gg)
)

可复制的示例

这是一个完整的应用程序,用于演示此设置。确保该应用可以“查找”报告

  • 将应用程序和Rmd文档放入同一文件夹
  • 使用runApp("path/to/app.R")调用应用程序,或使用RStudio中的“运行应用程序”按钮。

app.R

library(shiny)

ui <- fluidPage(
  textInput("main", "main", "main"),
  plotOutput("plot"),
  downloadButton("download_button")
)

server <- function(input, output, session) {
  draw_plot <- function() {
    plot(1:10, main = input$main)
  }
  output$plot <- renderPlot({
    draw_plot()
  })
  output$download_button <- downloadHandler(
    filename = "rendered_report.pdf",
    content = function(file) {
      res <- rmarkdown::render(
        "template.Rmd",
        params = list(
          draw_plot = draw_plot
        )
      )
      file.rename(res, file)
    }
  )
}

shinyApp(ui, server)

template.Rmd

---
output: pdf_document
params:
  draw_plot: NULL
---

```{r}
if (!is.null(params$draw_plot))
  params$draw_plot()
```