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

如何解决R生成PDF时YAML中Sys.time()无法显示系统时间的问题?

问题

在R Markdown的YAML中设置动态日期时,生成的LaTeX文档标题页直接显示r format(Sys.time(), "%d %B, %Y")原代码,而非实际系统时间。尝试去掉引号前的反斜杠后,又出现意外令牌错误,需要解决如何让输出的PDF准确显示系统时间的问题。

解决方案

核心问题是你当前把YAML当成字符串拼接后写入.tex文件再渲染,这种情况下YAML里的R代码块不会被解析。正确做法是提前计算好日期字符串,再直接嵌入YAML的date字段,不需要保留R代码块语法。

具体修改步骤

  1. 先在R环境中生成格式化好的日期字符串
  2. 将这个字符串直接插入YAML,避免转义和代码块语法

修改后的完整代码

# 安装并加载glue包(如果未安装)
if (!require(glue)) {
  install.packages("glue")
  library(glue)
}

# 提前计算格式化后的日期
current_date <- format(Sys.time(), "%d %B, %Y")

# 用glue拼接YAML,直接插入预计算的日期
yaml <- glue("
---
title: 'Grade Report'
author: 'John Smith'
date: '{current_date}'
output:
  pdf_document: 
---
\\pagenumbering{gobble}")

latex_code <- ''
for (i in 1:n) {
  latex_code <- paste0(latex_code, "\n\\n\\pagebreak\\n")
  currentname <- df2[1, paste("Student", i, sep = " ")]
  currentreport <- df2[df2[paste("Student", i, sep = " ")] == 1, c(1, 2, 3)]
  
  if (sum(!is.na(currentreport$Points)) == 0) {
    latex_code <- paste0(latex_code, '\n')  
    latex_code <- paste0(latex_code, "\\begin{center}\\n\\section*{", title, "}\\n\\end{center}\\n") 
    latex_code <- paste0(latex_code, "\\begin{center}\\n\\textbf{\\large Name: ", currentname, "}\\n\\end{center}\\n") 
    latex_code <- paste0(latex_code, "\\begin{center}\\n\\textbf{\\large Grade: 100 }\\n\\end{center}\\n") 
    latex_code <- paste0(latex_code, '\n\n')  
    latex_code <- paste0(latex_code, '&nbsp;')
    currentreport <- data.frame(Question = "-", Description = "-", Points = "-")
  } else {
    deduct <- sum(currentreport$Points)
    grade <- 100 + deduct
    
    latex_code <- paste0(latex_code, '\n')  
    latex_code <- paste0(latex_code, "\\begin{center}\\n\\section*{", title, "}\\n\\end{center}\\n") 
    latex_code <- paste0(latex_code, "\\begin{center}\\n\\textbf{\\large Name: ", currentname, "}\\n\\end{center}\\n") 
    latex_code <- paste0(latex_code, "\\begin{center}\\n\\textbf{\\large Grade: ", grade, "}\\n\\end{center}\\n") 
    latex_code <- paste0(latex_code, '\n\n')  
    
    currentreport[nrow(currentreport) + 1, ] <- list(NA, "Total points deducted", deduct)   
    currentreport[nrow(currentreport) + 1, ] <- list(NA, "Grade", grade)
  }
  
  table <- xtable(currentreport, align = "lclc")
  latex_code <- paste0(latex_code, print(table, hline.after = c(-1, 0, nrow(currentreport) - 2, nrow(currentreport)), 
                                        comment = FALSE, include.rownames = FALSE, digits = 0, size = 'large'))
  latex_code <- paste0(latex_code, '\n') 
}

latex_document <- paste(yaml, latex_code, collapse = '\n')

latex_file <- "output_table.tex"
writeLines(latex_document, latex_file)

render(latex_file)

替代方案(不用glue包)

如果不想使用glue,也可以用基础的paste0()拼接YAML:

current_date <- format(Sys.time(), "%d %B, %Y")

yaml <- paste0("
---
title: 'Grade Report'
author: 'John Smith'
date: '", current_date, "'
output:
  pdf_document: 
---
\\pagenumbering{gobble}")

内容的提问来源于Stack Exchange,提问作者David Beales

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.25 14:31:00