如何解决R生成PDF时YAML中Sys.time()无法显示系统时间的问题?
问题
在R Markdown的YAML中设置动态日期时,生成的LaTeX文档标题页直接显示r format(Sys.time(), "%d %B, %Y")原代码,而非实际系统时间。尝试去掉引号前的反斜杠后,又出现意外令牌错误,需要解决如何让输出的PDF准确显示系统时间的问题。
解决方案
核心问题是你当前把YAML当成字符串拼接后写入.tex文件再渲染,这种情况下YAML里的R代码块不会被解析。正确做法是提前计算好日期字符串,再直接嵌入YAML的date字段,不需要保留R代码块语法。
具体修改步骤
- 先在R环境中生成格式化好的日期字符串
- 将这个字符串直接插入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, ' ') 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
相关产品推荐
相关产品推荐

