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
相关产品推荐
相关产品推荐

