R Shiny中Download Handler调用rmarkdown::render()无法生成PDF问题排查
首先排查到3个核心错误,按优先级修复即可:
1. 拼写错误导致渲染完全失败
你代码里的rmarkdwon::render拼写错误,正确包名是rmarkdown,该错误会直接导致PDF生成流程中断,是下载失败的核心原因。
2. 参数传递逻辑错误
你试图直接调用plotM()/plotEAT()传递参数,但这两个是Shiny的output渲染对象,不是可传入Rmd的ggplot对象,需要先把绘图逻辑封装为返回ggplot对象的反应式变量。
3. 临时文件路径处理错误
自行指定output_file = "built_report.pdf"会出现工作目录匹配问题,直接将渲染结果输出到downloadHandler提供的file路径即可,无需中转读写。
修复后的完整代码调整
第一步:修改server部分,新增绘图反应式、修正downloadHandler
在你原来的server代码中,调整为如下逻辑:
server <- function(input, output) { # 原有数据反应式保留 MediaCompare3 <- eventReactive(input$Button, { det <-data.frame(group = c("a-du", "a-ges", "b-sport", "c-age"), means = c(16, 22, 31, 15) ) }) forplotEAT <- eventReactive (input$Button, { df<- data.frame(Komp = rep(c("Einstellungen zu Essen", "Sozialer Vergleich"), 3), groupW = c("ADu", "ADu", "AGesamt", "AGesamt", "ZGeschlecht","ZGeschlecht"), valuesW = c (19, 20, 21, 34, 12, 17 )) }) # 新增:封装绘图逻辑为返回ggplot对象的反应式,供前端渲染和PDF导出共用 plot_M <- reactive({ ggplot(MediaCompare3(), aes(x = group, y = means)) + geom_bar(stat = "identity", fill = "#013560", color = "#013560") + xlab(NULL) + ylab("Mediennutzung in Minuten")+ geom_text(aes(label = round(means, 0)), vjust =2, colour = "white", size= 8) }) plot_EAT <- reactive({ Geschlecht <- "girls" ggplot(forplotEAT(), aes(x = Komp, y = valuesW, fill = groupW)) + geom_bar(position = "dodge", stat = "identity",color = "#404040", show.legend = TRUE)+ xlab("Gruppe")+ ylab("Ergebnis")+ geom_text(aes(label = round(valuesW, 1)), vjust =2, colour = "white", size= 5, position = position_dodge(width= 0.9))+ scale_fill_manual(values= blues, name = "Vergleichsgruppen", labels=c("Du", "Gesamtdurchschnitt", Geschlecht)) }) # 原有output渲染改为调用上面的反应式 output$PlotM <- renderPlot({ plot_M() }) output$plotEAT <-renderPlot ({ plot_EAT() }) # 修正后的downloadHandler output$report <- downloadHandler( filename = function() { "Result.pdf" }, content = function(file) { rmarkdown::render( input = "report_file.Rmd", output_file = file, params = list( plotM = plot_M(), plotEAT = plot_EAT() ), envir = new.env(parent = globalenv()) ) } ) }
第二步:修改Rmd文件,确保ggplot对象正常渲染
--- title: "Individuelles Ergebnis" output: pdf_document params: plotM: NA plotEAT: NA --- ```{r echo=FALSE, warning=FALSE, message=FALSE} print(params$plotM)
print(params$plotEAT)
修复完成后,先确保`report_file.Rmd`和Shiny app的代码文件放在同一个文件夹下,再运行App即可正常下载PDF,文件名会自动显示为`Result.pdf`,文件类型也会正确识别为PDF。 内容的提问来源于stack exchange,提问作者Ninke
相关产品推荐
相关产品推荐

