r - 从 Shiny 应用程序生成可下载的报告
问题描述
我制作了一个 R 脚本,允许使用某种类型的数据集获取 R Markdown 报告。现在我希望其他人能够使用此脚本来获取包含他们的数据的自动报告,但无需使用此脚本(尤其是对于不掌握 R 的人)。
我尝试通过 Shiny 希望制作一个加载数据集的界面并自动生成我的脚本,但我无法在 Shiny 和我的 Rmd 之间建立链接。
如何告诉我的 Rmd 要处理的数据集不是我的 Rmd 脚本要在目录中查找的数据集,而是在 Shiny 界面上加载的数据集?
谢谢
这是带有我的 Rmd 的 Shiny 脚本,名为 "traitemant_bis.Rmd" :
library(shiny)
library(rmarkdown)
ui <- fluidPage(
titlePanel("Uploading Files"),
sidebarLayout(
sidebarPanel(
fileInput(
inputId = "file1", label = "Choose CSV File",
multiple = FALSE,
accept = c("text/csv", "text/comma-separated-values,text/plain", ".csv")
),
radioButtons("format", "Document format", c("PDF", "HTML", "Word"), inline = TRUE)
),
mainPanel(
tableOutput("contents"),
downloadButton("downloadReport")
)
)
)
server <- function(input, output) {
dataset <- reactive({
req(input$file1)
read.csv(file = input$file1$datapath,
na.strings = ".",
sep = ";",
header = TRUE,
nrows=10)
})
output$contents <- renderTable({
req(dataset())
head(dataset())
})
output$downloadReport <- downloadHandler(
filename = function() {
paste("my-report", sep = ".", switch(
input$format, PDF = "pdf", HTML = "html", Word = "docx"
))
},
content = function(file) {
src <- normalizePath("traitemant_bis.Rmd")
owd <- setwd(tempdir())
on.exit(setwd(owd))
file.copy(src, "traitemant_bis.Rmd", overwrite = TRUE)
out <- render("traitemant_bis.Rmd", switch(
input$format,
PDF = pdf_document(), HTML = html_document(), Word = word_document()
))
file.rename(out, file)
}
)
}
shinyApp(ui, server) ```
解决方案
我正在举一个简单的例子来展示你如何做到这一点。基本上,您可以将任何数据从 传递shiny
到Rmd
as params
。
如果您有多个数据框或任何数据将它们转换为单个列表并作为参数传递,您可以稍后在 RMarkdown 中提取单个数据
应用程序.R
library(shiny)
ui <- fluidPage(
# Application title
titlePanel("RMD example"),
downloadButton("btn", "Generate Report")
)
# Define server logic required to draw a histogram
server <- function(input, output) {
data <- reactive({
mtcars
})
output$btn <- downloadHandler(
filename = function(){"myreport.docx"},
content = function(file) {
tempReport <- file.path(tempdir(),"markdown.Rmd")
file.copy("markdown.Rmd", tempReport, overwrite = TRUE)
rmarkdown::render("markdown.Rmd", output_format = "word_document", output_file = file,
params = list(table = data()), # here I'm passing data in params
envir = new.env(parent = globalenv()),clean=F,encoding="utf-8"
)
}
)
}
# Run the application
shinyApp(ui = ui, server = server)
rmd文件
---
title: "Untitled"
author: "Mohan"
date: "2/17/2021"
params:
table: [some object]
output: word_document
---
```{r setup, include=FALSE}
knitr::opts_chunk$set(echo = TRUE)
```
## R Markdown
This is an R Markdown document. Markdown is a simple formatting syntax for authoring HTML, PDF, and MS Word documents. For more details on using R Markdown see <http://rmarkdown.rstudio.com>.
When you click the **Knit** button a document will be generated that includes both content as well as the output of any embedded R code chunks within the document. You can embed an R code chunk like this:
```{r cars}
params$table -> data
data
summary(data)
```
推荐阅读
- android - 如何使用 createBottomTabNavigator 为 React Navigation 过渡设置动画?
- c - 错误没有名为“reqevents”的成员;在 AIX 上构建 Redis 时您的意思是“事件”吗
- r - 更改 R 中生存分析的数据格式
- android - 如何从android数组列表中的单选组中获取选定的单选按钮文本
- javascript - 如何渲染 TradingView 小部件并使用 Javascript 将其保存为 png
- android - 面向 Android 12 及更高版本的应用需要为
- javascript - 防止用户输入负数的 Html 文本框四舍五入正十进制数
- javascript - 使用 Google Apps 脚本删除幻灯片表格底部的空合并行
- php - 如何从 WP_term 对象中回显一个值?
- javascript - 使边界框在画布外可见