[英]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)
)
這是一個完整的應用程序來演示此設置。 確保應用程序可以“找到”報告
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)
---
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.