对于我遇到的问题,以下代码是一个非常简化的 MRE 。我正在尝试避免R
模板包,例如brew
,并且仅使用knit_expand()
来实现我的目标。 问题有两个方面:
\includegraphics
,knitr
(或rmarkdown
或pandoc
)会生成RMarkdown语法以插入数字(![]
)。关于前者,我觉得这可能与我错误地使用get()
或其论点有关。非常感谢您的建议。 MRE 跟随('.Rmd'文档):
---
title: "MRE: a dynamic chunk issue"
author: "Aleksandr Blekh"
output:
pdf_document:
fig_caption: yes
keep_tex: yes
highlight: NULL
---
```{r, echo=FALSE, include=FALSE}
library(knitr)
opts_knit$set(progress = F, verbose = F)
opts_chunk$set(comment=NA, warning=FALSE, message=FALSE, echo=FALSE, tidy=FALSE)
```
```{r Preparation, results='hide'}
g1 <- plot(cars)
g2 <- plot(iris$Sepal.Length)
myPlots <- list(g1, g2)
bcRefStr <- list("objType" = "fig",
"objs" = c("g1", "g2"),
"str" = "Plots \\ref{fig:g1} and \\ref{fig:g2}")
```
```{r DynamicChunk, include=FALSE}
chunkName <- "{{name}}"
chunkHeader <- paste0("```{r ", chunkName, ", ")
chunkOptions <- "include=TRUE, results='asis', fig.height=4, fig.width=4, fig.cap='{{name}}'"
chunkHeaderFull <- paste0(chunkHeader, chunkOptions, "}")
chunkBody <- "print(get('{{name}}'))"
latexFigEnvBegin <- "cat('\\\\begin{figure}')"
latexFigEnvEnd <- "cat('\\\\end{figure}')"
latexFigCenter <- "cat('\\\\centering')"
latexObjLabel <- paste0("cat('\\\\caption{\\\\ ", "{{name}}\\\\label{", bcRefStr$objType, ":{{name}}", "}}')")
chunkText <- c(chunkHeaderFull,
latexFigEnvBegin, latexFigCenter,
chunkBody,
latexObjLabel, latexFigEnvEnd,
"```", "\n")
figReportParts <- lapply(bcRefStr$objs, function (x) knit_expand(text = chunkText, name = x))
```
`r knit(text = unlist(figReportParts))`
答案 0 :(得分:0)
最后,我已经弄明白导致问题的原因。 第一部分很简单。由于建议的简化,我已从ggplot2
切换到标准R
图形功能。问题是,plot()
似乎没有返回值/对象,因此在输出中看到了NULL,而不是绘图。
第二部分有点棘手,但对相关问题(https://stackoverflow.com/a/24087398/2872891)的回答澄清了这种情况。基于该信息,我能够相应地修改我的MRE,并且生成的文档显示正确的内容(同样适用于生成的LaTeX源,它似乎已准备好进行交叉引用)。
我正在考虑将此代码转换为更通用的函数,以便在我的项目中重复使用,如果时间允许[不应该花费很长时间](@Yihui,这对{{1}有用吗?项目?)。感谢所有花时间分析,帮助或只是阅读这个问题的人。我认为knitr
的文档应该更清楚地解决与从knitr
来源生成PDF
文档相关的问题。我的解决方案适用于MRE。
RMarkdown