我制作一个闪亮的应用程序,将创建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
提前感谢所有帮助的人。有些英雄不穿斗篷。
最佳
答案 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)
)
这是一个完整的应用程序,用于演示此设置。确保该应用可以“查找”报告
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()
```