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

使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.18 14:49:55