0

对于我遇到的问题,以下代码是一个非常简化的MRE 。我试图避免R使用模板包,例如brew,并且仅用于knit_expand()实现我的目标。这个问题是双重的:

  1. 生成的块不会被解析(这在我的真实代码中没有发生,但在 MRE 中发生)
  2. 而不是 LaTeX \includegraphicsknitr(或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))`
4

1 回答 1

1

最后,我弄清楚了导致问题的原因。第一部分很容易。由于建议的简化,我已从ggplot2标准R图形功能切换。问题是它似乎plot()没有返回值/对象,所以这就是为什么在输出中看到了 NULL,而不是绘图。

第二部分有点棘手,但对相关问题 ( https://stackoverflow.com/a/24087398/2872891 ) 的回答澄清了这种情况。基于该信息,我能够相应地修改我的 MRE,并且生成的文档显示正确的内容(同样适用于生成的 LaTeX 源,它似乎已准备好进行交叉引用)。

我正在考虑将此代码转换为更通用的函数,以便在我的项目中重用,如果时间允许的话[不应该花很长时间](@Yihui,这对knitr项目有用吗?)。感谢所有花时间分析、帮助或只是阅读此问题的人。我认为该knitr文档应该更清楚地说明与从源代码生成PDF文档相关的问题。RMarkdown我对 MRE的解决方案如下。

---
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)
library(ggplot2)

opts_knit$set(progress = F, verbose = F)
opts_chunk$set(comment=NA, warning=FALSE, message=FALSE, echo=FALSE, tidy=FALSE)
```

```{r Preparation, results='hide'}
library(ggplot2)

g1 <- qplot(mpg, wt, data=mtcars)
g2 <- qplot(mpg, hp, data=mtcars)

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}

latexObjLabel <- paste0("{{name}}\\\\label{", bcRefStr$objType, ":{{name}}", "}")

chunkName <- "{{name}}"
chunkHeader <- paste0("```{r ", chunkName, ", ")
chunkOptions <- paste0("include=TRUE, results='asis', fig.height=4, fig.width=4, fig.cap='", latexObjLabel, "'")
chunkHeaderFull <- paste0(chunkHeader, chunkOptions, "}")
chunkBody <- "print(get('{{name}}'))"

chunkText <- c(chunkHeaderFull,
               chunkBody,
               "```", "\n")

figReportParts <- lapply(bcRefStr$objs, function (x) knit_expand(text = chunkText, name = x))
```

`r knit(text = unlist(figReportParts))`
于 2014-11-13T06:42:58.127 回答