簡體   English   中英

在 Shiny 中下載 PDF 報告

[英]Download Pdf report in Shiny

我正在制作一個閃亮的應用程序,它將創建 2 個圖和一個表。

選擇輸入部分有很多選項。

選擇后,它將對 data.frame 進行子集化並返回另一個要分析的 data.frame。

它將相應地進行繪圖,我希望它以 pdf(或 html)格式生成包含輸入詳細信息的報告。

就像“生成報告”按鈕一樣,並為我提供該特定輸入的繪圖以及 input$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 在不同的文檔中。

我已經拆分了 UI 和服務器並發布了,但仍然出錯。

我在 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   

在此先感謝所有提供幫助的人。 有些英雄不穿斗篷。

最好的

為什么將圖作為參數傳遞可能會失敗

對於 ggplots 和其他特殊繪圖類型,可以將繪圖保存為變量,但對於通常使用plot()函數生成的更一般的“基本繪圖”則不然。 換句話說, plot()的返回值沒有意義,因為繪制繪圖是函數的副作用。

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

因此有必要將這些副作用“傳遞”給 rmarkdown 報告而不是返回值。

解決方法:函數

傳遞副作用的一種方法是函數。 為此,您首先定義一個繪制繪圖的函數。 然后將新定義的函數作為參數傳遞給Rmd-document

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

現在可以在 Rmd 文檔中調用該函數,並且將在那里(重新)繪制該圖。 一般來說,可以在參數化報告中將任何 R 對象作為參數傳遞,而函數(閉包)對於此類用例來說是一種非常靈活的對象類型。

如果可能,傳遞對象

但是請注意,某些繪圖庫確實允許將繪圖存儲在變量中。 在這些情況下,函數不是必需的。 您只需要傳遞生成繪圖的函數的返回對象。

library(ggplot2)

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

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

可重現的例子

這是一個完整的應用程序來演示此設置。 確保應用程序可以“找到”報告

  • 把app和Rmd文檔放到同一個文件夾
  • 使用runApp("path/to/app.R")調用應用程序或使用 RStudio 中的“運行應用程序”按鈕。

應用程序

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)

模板.Rmd

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

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM