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

Shiny应用中Plotly与RMarkdown PDF整合失败:LaTeX编译错误

问题解决:Shiny中Plotly图表整合到RMarkdown PDF失败

核心问题分析

PDF生成失败主要源于RMarkdown模板格式错误、模板未正确调用传入的图片参数,同时存在LaTeX编译的隐性依赖问题。

具体修复步骤

1. 修正RMarkdown模板

原模板存在YAML格式非法、未插入图片、R代码未包裹代码块三个关键错误,替换为以下模板:

writeLines(
  con = file.path(tempdir(), 'report_template.rmd'),
  text = '---
title: "Self Assessment Report"
output: pdf_document
params:
  responses: !r list()
  plot_path: ""
---

```{r setup, include=FALSE}
options(tinytex.verbose = TRUE)
knitr::opts_chunk$set(echo = FALSE)

用户响应

for (i in seq_along(params$responses)) {
  cat(sprintf("**Response %d:**\\n", i))
  cat(params$responses[[i]], "\\n\\n")
}

自评图表

if(nzchar(params$plot_path)) {
  knitr::include_graphics(params$plot_path)
}

'
)

### 2. 优化Shiny服务器端PDF生成逻辑
确保临时PNG文件在渲染时已生成,同时添加错误捕获:

```r
output$dnld <- downloadHandler(
  filename = function() "self_assessment_report.pdf",
  content = function(file) {
    # 保存Plotly图表为PNG
    temp_html <- tempfile(fileext = ".html")
    temp_png <- tempfile(fileext = ".png")
    htmlwidgets::saveWidget(myPlotlyGraph(), temp_html, selfcontained = TRUE)
    # 延迟确保截图完成
    Sys.sleep(1)
    webshot2::webshot(temp_html, file = temp_png, vwidth = 500, vheight = 400)
    
    # 收集用户响应(空值替换为默认文本)
    response_list <- lapply(1:6, function(i) {
      txt <- input[[paste0("response_text", i)]]
      if(is.null(txt) || txt == "") "无评论" else txt
    })
    
    # 渲染PDF并捕获错误
    tryCatch({
      rmarkdown::render(
        input = file.path(tempdir(), "report_template.rmd"),
        output_file = file,
        params = list(
          responses = response_list,
          plot_path = temp_png
        ),
        envir = new.env(parent = globalenv())
      )
    }, error = function(e) {
      stop(paste("PDF生成失败:", e$message))
    })
  }
)

3. 补充LaTeX依赖检查

如果仍报错,手动安装PDF图片处理所需的LaTeX包:

tinytex::tlmgr_install(c("graphicx", "float"))

修复说明

  • YAML结构修正:将options代码移至R代码块,避免LaTeX解析YAML时出错。
  • 图片渲染逻辑:通过knitr::include_graphics调用传入的图片路径,确保图表被插入PDF。
  • 代码块规范:将响应循环代码放入R代码块,保证R代码被执行而非当作纯文本输出。
  • 临时文件处理:增加Sys.sleep(1)等待截图完成,避免RMarkdown渲染时文件未生成。

内容的提问来源于stack exchange,提问作者Bubbles

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.13 07:22:02