You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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
相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.02 09:09:02