使用gglikert()时R Markdown与LaTeX编译报错问题排查
问题描述
我有两个R文件:一个名为“execute”的R脚本,用于执行render函数调用名为“Generator.Rmd”的R Markdown文件。该R Markdown文件会根据数据框df中的唯一年份生成对应数量的PDF,但运行时出现LaTeX编译失败错误,报错信息如下:
报错信息
Error: LaTeX failed to compile /Users/.../_report.tex. See https://yihui.org/tinytex/r/#debugging for debugging tips.
R脚本代码
path = "/Users/..." library(tidyverse) set.seed(123) likert_levels <- c( "1" = "Very Dissatisfied", "2" = "Dissatisfied", "3" = "Neutral", "4" = "Satisfied", "5" = "Very Satisfied") df = data.frame( year = sample(c(2023, 2022, 2020, 2018), 50, replace = TRUE), A = sample(likert_levels, 50, replace = TRUE), B = sample(likert_levels, 50, replace = TRUE), C = sample(likert_levels, 50, replace = TRUE))%>% mutate(across(everything(),as.factor))%>% as_tibble()%>% mutate(across(-year, ~ factor(.x, levels = likert_levels))) for (i in unique(df$year)){ df_year = df%>% dplyr::filter(year == i) rmarkdown::render( # 1. Search for your base report input = paste0(path,"Generator.Rmd"), # 2. Establish the format output_format = "pdf_document", # 3. Define the output file name output_file = paste0(i, "_report.pdf"), # 4. Define an output folder/directory output_dir = path, # 5. Integrate your parameters params = list(year = i, DFEmpRecords = df_year))}
R Markdown脚本代码
--- geometry: top=1cm , bottom= 2cm , left=0.5cm, right=0.5cm header-includes: - \PassOptionsToPackage{dvipsnames,table}{xcolor} - \usepackage{xcolor} - \usepackage{graphicx} - \usepackage[nounderscore]{syntax} - \usepackage{multirow} - \usepackage{rotating} - \usepackage{array} - \usepackage{hyperref} - \usepackage{readarray} - \usepackage{float} - \usepackage{epstopdf} classoption: table output: pdf_document: default params: year: 0 DFEmpRecords: 0 --- ```{r setup, include=FALSE} knitr::opts_chunk$set(echo = FALSE) library(kableExtra) library(tidyverse) library(ggplot2) library(ggstats)
YEAR = params$year DF = params$DFEmpRecords
category = DF%>% as_tibble()%>% dplyr::select(A,B,C)%>% dplyr::mutate(across(everything(), ~ case_when( . == "1" ~ likert_levels["1"], . == "2" ~ likert_levels["2"], . == "3" ~ likert_levels["3"], . == "4" ~ likert_levels["4"], . == "5" ~ likert_levels["5"])))%>% dplyr::mutate(across(everything(), ~ factor(.x, levels =likert_levels)))%>% as.data.frame()%>% ggstats::gglikert() category
# 排查方案 ## 1. 获取完整LaTeX编译日志 当前报错仅提示编译失败,无具体原因。按以下步骤获取详细日志: - 在`rmarkdown::render()`中添加`clean = FALSE`参数,保留编译生成的`.tex`和日志文件; - 找到对应`.tex`文件的`.log`文件,查看具体错误行(比如缺失包、语法错误、内容溢出等)。 ## 2. 修复Rmd中变量未定义问题 Rmd代码块里的`likert_levels`变量仅在execute脚本中定义,Rmd无法直接访问,需修改: - 在execute脚本的`params`中添加`likert_levels = likert_levels`; - 在Rmd的`setup`代码块中加入`likert_levels <- params$likert_levels`。 ## 3. 检查LaTeX包依赖 Rmd的`header-includes`调用了多个LaTeX包,可能存在缺失或冲突: - 确认LaTeX发行版(如TinyTeX、TeX Live)已安装所有依赖包,非核心包(如`syntax`、`readarray`)可能需手动安装; - 尝试移除非必要包(比如`readarray`如果未用到可先注释),逐步排查问题包; - 将`\usepackage{hyperref}`移到`header-includes`最后一行,避免和其他包冲突。 ## 4. 调整图表与页面排版 当前图表尺寸(`fig.width=8, fig.height=9`)结合窄边距(左右0.5cm)可能导致内容溢出,触发LaTeX错误: - 缩小图表尺寸,比如改为`fig.width=7, fig.height=8`; - 调整页面边距,将左右边距改为1cm; - 在图表代码块中添加`fig.align='center'`确保居中。 ## 5. 测试单年份生成 先跳过循环,单独测试某一年份的生成,验证是否是循环导致的问题: ```r rmarkdown::render( input = paste0(path,"Generator.Rmd"), output_format = "pdf_document", output_file = "test_report.pdf", output_dir = path, params = list(year = 2023, DFEmpRecords = df %>% filter(year == 2023), likert_levels = likert_levels))
内容的提问来源于stack exchange,提问作者Homer Jay Simpson
相关产品推荐
相关产品推荐

