如何从生成的 HTML 文档的 ToC 中排除未评估的 R 标记部分?

How to exclude the not evaluated R markup sections from the ToC of the resulting HTML document?

我正在编写 R/Shiny 代码,使用 R 标记模板为我的用户数据生成 HTML 报告。我想为用户提供从报告中省略某些部分的选项。这对于章节本身来说很容易做到,但对于章节的标题和目录条目来说并不明显。任何建议将不胜感激!

我的代码通过 rmarkdown::render 函数的 params 变量传递要包含在报告中的部分列表。并且 R 标记文件中省略的部分确实没有被评估。但是,这些(空的)部分的 ToC 条目和标题最终仍会出现在生成的 HTML 文件中。我浏览了手册,但找不到任何方法来使用标记代码参数来排除标记文件的所需部分。


    ---
    output:
      html_document:
        theme: yeti
        df_print: kable
        toc: true
        toc_float:
          collapsed: true
          smooth_scroll: false
    params:
      ExpData: data.frame()
      set_title: "My Data Report"
      Sections_to_include: list()
    title: "`r params$set_title`"
    ---

    .....................................
    .....................................
    .....................................

    # ANOVA 

    ```{r , eval = ( "ANOVA" %in% params$Sections_to_include)}

    # Here be the code that generates my ANOVA table
    # lme_model is calculated from params$ExpData in the preceding
    # code chunks

    kable(ANOVA(lme_model))
    ```

如果 params$Sections_to_include 列表不包含元素 "ANOVA" 那么上面的代码块不会进行评估,也不会打印方差分析 table。但是,章节标题 ANOVA 仍将包含在空章节之前的 HTML 文档中,并且 ToC 将包含该标题的 link。这当然是

# ANOVA

行指示 R 标记执行的操作。我想知道是否有任何参数可以让我指示 R 标记渲染器忽略该行。

我能看到的一个解决方案是将工作流程更改为 (i) 根据所需选项(例如,使用 UNIX 命令行工具)从基本模板生成自定义 R 标记文档,以及 (ii) 然后呈现将自定义标记文件转换为 HTML 文档。但我想知道 R 标记/knitr 是否提供更简单的 built-in 解决方案?

谢谢大家!

您可以使用 "asis" 引擎来完成。编写一个小函数来决定是否应包含某些内容可能会有所帮助。这是您的示例,已修改为省略 "ANOVA",但包括另外两个部分。

---
output:
  html_document:
    theme: yeti
    df_print: kable
    toc: true
    toc_float:
      collapsed: true
      smooth_scroll: false
params:
  ExpData: data.frame()
  set_title: "My Data Report"
  Sections_to_include: ["Other", "More"]
title: "`r params$set_title`"
---

.....................................
.....................................
.....................................

```{r include=FALSE}
library(knitr)
include <- function(section) {
  section %in% params$Sections_to_include
}
```


```{asis , echo=include("Other")}
# Other section

This is a section that I do want to include, this time.
```

```{asis echo=include("ANOVA")}
# ANOVA 
```

```{r , echo = include("ANOVA"), eval = include("ANOVA")}

# Here be the code that generates my ANOVA table
# lme_model is calculated from params$ExpData in the preceding
# code chunks

kable(ANOVA(lme_model))
```

```{asis , echo=include("More")}
# More

So is this one.
```

我不确定如何从 YAML 中以编程方式生成 Sections_to_include 中部分名称的向量,但您始终可以在对 rmarkdown::render.[=14= 的调用中传递参数值]