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

Shiny App生成PDF报告显示代码及NULL错误的解决咨询

问题:Shiny App下载PDF报告仅显示NULL和代码,无数据

问题分析

你遇到的PDF显示NULL的问题,核心有三个错误:

  1. 错误读取数据来源:input$client_info_table是Shiny输出组件的ID,不是实际的表格数据,无法直接作为参数传递给Rmd文档。
  2. 嵌套定义downloadHandler:在output$report的content函数里重复定义了一次output$report <- downloadHandler(...),导致渲染逻辑混乱,完全没必要。
  3. Rmd参数默认值不匹配:Rmd里info参数默认设为空字符串"",但实际要传递的是数据框,类型不匹配会导致读取失败。

修正方案

1. 修正Shiny Server代码

把生成表格的逻辑抽成独立的反应式对象,移除嵌套的downloadHandler,正确传递数据:

server <- function(input, output, session) {
  # 抽离表格数据为反应式对象,方便重复调用
  client_data <- reactive({
    data.frame(
      Date = format(input$date, format = "%B %d, %Y"),
      Name = input$txt1,
      NIT = input$txt2,
      Phone = input$txt3,
      Email = input$txt4
    )
  })
  
  output$client_info_table <- shiny::renderTable({
    client_data()  # 调用反应式对象生成表格
  })
  
  output$report <- downloadHandler(
    filename = function() {
      paste0("Cost_", Sys.Date(), ".pdf")  # 可选:添加日期区分文件
    },
    content = function(file) {
      id <- showNotification(
        "Rendering report...", 
        duration = NULL, 
        closeButton = FALSE
      )
      on.exit(removeNotification(id), add = TRUE)
      
      # 传递反应式对象的实际数据
      params <- list(info = client_data())
      
      rmarkdown::render(
        input = "report.Rmd",
        output_file = file,
        params = params,
        envir = new.env(parent = globalenv())
      )
    }
  )
}

2. 修正Rmd文档

把info参数的默认值改为NULL,并确保正确渲染表格:

---
title: "Cost"
output: pdf_document
latex_engine: tinytex
params:
  info: NULL
---

```{r echo=FALSE}
# 检查参数是否存在,然后渲染表格
if (!is.null(params$info)) {
  knitr::kable(params$info, align = "c")  # 用kable生成美观的表格
}
### 3. 关于Pandoc警告的说明
你看到的`[WARNING] Deprecated: --self-contained. use --embed-resources --standalone`是rmarkdown调用pandoc时的过时参数警告,属于版本兼容问题,**不影响PDF生成功能**,无需手动处理,后续rmarkdown版本更新后会自动修复。

内容的提问来源于stack exchange,提问作者att_expat
相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.05 09:35:34