knitr模板 - 动态块问题

时间:2014-11-12 09:50:10

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

对于我遇到的问题,以下代码是一个非常简化的 MRE 。我正在尝试避免R模板包,例如brew,并且仅使用knit_expand()来实现我的目标。 问题有两个方面:

  1. 生成的块不会被解析(这不是在我的实际代码中发生,而是在MRE中发生)
  2. 而不是LaTeX \includegraphicsknitr(或rmarkdownpandoc)会生成RMarkdown语法以插入数字(![])。
  3. 关于前者,我觉得这可能与我错误地使用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))`
    

1 个答案:

答案 0 :(得分:0)

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

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

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

RMarkdown