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

Shiny渲染Rmd生成PDF时触发LaTeX紧急停止编译报错求助

问题根因

报错核心是Windows系统8.3短文件名兼容性问题:

  • 系统用户名长度超过8个字符时,系统默认临时目录tempdir()的路径会被自动转换为带~的短截断路径(编译日志里显示为C:/Users/TOADST~1/...)
  • TeX Live 2022 Windows版本的pdflatex无法正确解析这类带截断标识的输入文件路径,从日志可以看到pdflatex读取路径到C:/Users/TOADST~就中断,根本没有加载到完整的.tex文件内容,直接触发! Emergency stop致命错误
  • 这也解释了为什么手动knit正常(文件在项目工作目录,无短路径截断)、HTML输出正常(不需要调用pdflatex)、简单tex测试正常(测试文件在当前工作目录,路径合法),和LaTeX内容缺失\end{document}无关。
解决方案

按优先级选择以下任意一种方案即可修复:

方案1:修改渲染临时目录(最推荐,改动最小)

不要使用系统默认的tempdir()存放渲染中间文件,在Shiny应用中指定一个路径层级浅、无空格、无长用户名的目录作为渲染工作目录,修改downloadHandler的content逻辑如下:

server <- function(input, output, session){
  output$reportbut <- downloadHandler(
    filename = "report.pdf",
    content = function(file){
      # 自定义临时渲染目录,提前创建确保读写权限
      render_dir <- "C:/shiny_render_temp"
      dir.create(render_dir, recursive = TRUE, showWarnings = FALSE)
      
      tempReport <- file.path(render_dir, "report.Rmd")
      file.copy("report.Rmd", tempReport, overwrite = TRUE)
      params <- list(name = df$name, df = df, pheno = df$pheno, geno = df$geno)
      
      rmarkdown::render(
        tempReport, 
        output_file = file,
        params = params,
        envir = new.env(parent = globalenv()),
        intermediates_dir = render_dir, # 指定中间文件存放目录
        clean = TRUE
      )
    }
  )
}

方案2:全局修改R会话临时目录

在Shiny应用最开头(加载任何依赖包之前)添加以下代码,全局替换R会话的临时目录路径,从根源避开系统用户目录的短路径问题:

# 应用启动第一行执行
custom_temp <- "C:/r_temp"
dir.create(custom_temp, recursive = TRUE, showWarnings = FALSE)
Sys.setenv(TMPDIR = custom_temp, TEMP = custom_temp, TMP = custom_temp)

设置后所有R生成的临时文件都会写入自定义目录,不会再触发短路径截断问题。

注意事项
  • 自定义临时目录不要选择需要管理员权限的路径(如C:/Windows、C:/Program Files),避免读写权限报错
  • 修复后可以再次开启tinytex.verbose查看日志,pdflatex读取的.tex路径不再带~截断标识即可正常编译

内容的提问来源于stack exchange,提问作者s-mabdurrazak

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 04:21:33