r语言 - 以 sh 显示格式下载报告时出现服务器故障问题错误



我想将我的Shiny应用程序的输出保存为PDF和word文件。就像它发生在这里一样。

可以在 Shiny 服务器上找到相同的代码并完美生成报告,但是当我在本地运行它时,生成的输出是一个空白的 HTML 文件,而 PDF 会给出服务器错误。 我已经尝试过,创建一个空白

报告。马币

fluidPage(
title = 'Download a PDF report',
sidebarLayout(
sidebarPanel(
helpText(),
selectInput('x', 'Build a regression model of mpg against:',
choices = names(mtcars)[-1]),
radioButtons('format', 'Document format', c('PDF', 'HTML', 'Word'),
inline = TRUE),
downloadButton('downloadReport')
),
mainPanel(
plotOutput('regPlot')
)
)
)
shinyServer(function(input, output) {
# list of data sets
datasetInput <- reactive({
switch(input$dataset,
"cars" = mtcars,
"longley" = longley,
"MLB" = mlb11,    
"rock" = rock,
"pressure" = pressure, 
"Your Data" = df())
})
# dependent variable
output$dv = renderUI({
selectInput('dv', h5('Dependent Variable'), choices = names(datasetInput()))
})
# independent variable
output$iv = renderUI({
selectInput('iv', h5('Independent Variable'), choices = names(datasetInput()))
})
# regression formula
regFormula <- reactive({
as.formula(paste(input$dv, '~', input$iv))
})
# bivariate model
model <- reactive({
lm(regFormula(), data = datasetInput())
})

# create graphics 
# data view 
output$view <- renderTable({
head(datasetInput(), n = input$obs)
})
# summary statistics
output$summary <- renderPrint({
summary(cbind(datasetInput()[input$dv], datasetInput()[input$iv]))
})
# histograms   
output$distPlot_dv <- renderPlot({
x    <- datasetInput()[,input$dv]  
bins <- seq(min(x), max(x), length.out = input$bins_dv + 1)
hist(x, breaks = bins, col = 'darkgray', border = 'white', main = 'Dependent Variable', xlab = input$dv)
})

output$distPlot_iv <- renderPlot({
x    <- datasetInput()[,input$iv]  
bins <- seq(min(x), max(x), length.out = input$bins_iv + 1)
hist(x, breaks = bins, col = 'darkgray', border = 'white', main = 'Independent Variable', xlab = input$iv)
})
# scatter plot 
output$scatter <- renderPlot({
plot(datasetInput()[,input$iv], datasetInput()[,input$dv],
xlab = input$iv, ylab = input$dv,  main = "Scatter Plot of Independent and Dependent Variables", pch = 16, 
col = "black", cex = 1) 
abline(lm(datasetInput()[,input$dv]~datasetInput()[,input$iv]), col="grey", lwd = 2) 
})
# correlation matrix
output$corr <- renderGvis({
d <- datasetInput()[,sapply(datasetInput(),is.integer)|sapply(datasetInput(),is.numeric)] 
cor <- as.data.frame(round(cor(d), 2))
cor <- cbind(Variables = rownames(cor), cor)
gvisTable(cor) 
})
# bivariate model
output$model <- renderPrint({
summary(model())
})
# residuals
output$residuals_hist <- renderPlot({
hist(model()$residuals, main = paste(input$dv, '~', input$iv), xlab = 'Residuals') 
})
output$residuals_scatter <- renderPlot({
plot(model()$residuals ~ datasetInput()[,input$iv], xlab = input$iv, ylab = 'Residuals')
abline(h = 0, lty = 3) 
})
output$residuals_qqline <- renderPlot({
qqnorm(model()$residuals)
qqline(model()$residuals) 
})
# hotable
output$hotable1 <- renderHotable({
df <- data.frame(String = c('a', 'b', 'c', 'd', 'e','a', 'b', 'c', 'd', 'e'), 
Numeric1 = numeric(10), 
Numeric2 = numeric(10))
return(df)
}, readOnly = FALSE)
df <- reactive({
hot.to.df(input$hotable1) # this will convert your input into a data.frame
})

# download report
output$downloadReport <- downloadHandler(
filename = function() {
paste('my-report', sep = '.', switch(
input$format, PDF = 'pdf', HTML = 'html', Word = 'docx'
))
},
content = function(file) {
src <- normalizePath('report.Rmd')
owd <- setwd(tempdir())
on.exit(setwd(owd))
file.copy(src, 'report.Rmd')
library(rmarkdown)
out <- render('report.Rmd', switch(
input$format,
PDF = pdf_document(), HTML = html_document(), Word = word_document()
))
file.rename(out, file)
})
})
filename = "report.html"

您是否尝试将其更改为.pdf?

我已经设法根据上面提供的代码使文档呈现(我还测试了单词输出)。我不得不根据您的链接中提供的代码进行一些更改。

您需要确保/注意以下事项:

  1. rmarkdown包中的render()函数必须采用原始xx.Rmd模板作为需要存储在工作目录中的输入。
  2. 然后,render()函数将 (1) 中所述的原始输入传递给knitr,执行所有R代码块并创建一个新的.Rmd文档,该文档随后传递到生成最终输出(pdf、html、word)的pandoc
  3. 如果你想要一个pdf文档,你需要在你的机器上安装pdflatex这可以通过Miktex发行版(https://miktex.org/download)或TeX Live发行版(https://www.tug.org/texlive/acquire.html)获得。
  4. 在编织文档之前,您需要告诉它使用哪种pandoc方法,这需要采用rmarkdown::html_document(), rmarkdown::pdf_document(), rmarkdown::word_document()的形式。
  5. 因此,与您的示例相关的渲染函数将是rmarkdown::render(report.Rmd, pdf_document())rmarkdown::render(report.Rmd, pdf_document())

R 降价示例模板

这是我创建的report.Rmd模板作为示例,请将其存储在您的工作目录中:

---
title: "Test R Markdown"
author: "RickTastic!!"
date: "January 9, 2019"
output: html_document
---
```{r setup, include = FALSE}
knitr::opts_chunk$set(echo = TRUE)
```
## R Markdown
This is an R Markdown document. You need a document like this to pass to the render function. You will then want to embed your output code like this `r sum(c(1, 2, 3))`
## Showing the slider number
```{r sliderNumber, include = FALSE}
sliderNumber <- function() return(as.numeric(input$slider))
```
The input selected from the slider is `r sliderNumber()`. Your function needs to be defined in your .Rmd template.

R 源代码,它使用上述模板并返回单击下载按钮时选择的滑块编号

library(shiny)
library(rmarkdown)
ui <- fluidPage(sliderInput("slider", "Slider", 1, 100, 50), downloadButton("report", "Generate report"))
server <- function(input, output, session) {
sliderInput <- reactive(return(as.numeric(input$slider)))
output$report <- downloadHandler(
filename = function() return("myReport.html"),
content = function(file) {
src <- normalizePath("report.Rmd")
owd <- setwd(tempdir())
on.exit(setwd(owd))
file.copy(src, "report.Rmd", overwrite = TRUE)
out <- render("report.Rmd", html_document())
file.rename(out, file)
}
)
}
shiny::shinyApp(ui = ui, server = server)

最新更新