【问题标题】:knitr templating - Dynamic chunks issueknitr 模板 - 动态块问题
【发布时间】:2014-11-12 09:50:10
【问题描述】:

以下代码是针对我遇到的问题的非常简化的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))`

【问题讨论】:

  • @Andrie:感谢您编辑我的问题。我太关心问题本身,而忽略了提高问题的可读性。
  • 你能把你的例子最小化吗?例如,有很多不必要的漂亮图形创建。简化图。然后简化并删除一些乳胶格式。这将使真正的问题出现。目前我只是盯着一堵代码墙,想知道它的一半是做什么的。
  • 我不认为你的问题根本上与针织块有关。尝试以交互方式从 R 运行代码,然后在最后一个块评估 invisible(sapply(figReportParts, cat)); lapply(figReportParts, function(p) knit(text=p)) 之前。这是在最后一块中编织的内容,但它包含错误。解决这个问题,然后其余的可能会到位。
  • 在您进行编辑之前,我以为我知道您在问什么。现在它只是混合在一起的文本和代码的一种模糊。我建议您删除对“当前状态”和“更新”的引用。写下这个问题,这样它就可以与任何以全新的眼光阅读问题的人保持一致。此外,你真的不需要所有的乳胶来说明问题的关键。尽量使它最小。 PS。我一直在试图理解这段代码的作用,但没有更接近答案。
  • @Tripartio MRE 代表 minimal reproducible example。请在此处查看详细信息:stackoverflow.com/questions/5963269/…。 Stack Exchange 上的其他地方也有类似的答案,但这应该足以理解和使用这个概念,而不管编程语言如何。

标签: r knitr pandoc r-markdown reproducible-research


【解决方案1】:

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

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

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

【讨论】:

    猜你喜欢
    • 2011-11-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-10
    相关资源
    最近更新 更多