自定义knit_hooks可以在R chunk之前和之后设置选项吗?

时间:2016-08-31 22:05:43

标签: r knitr

我想使用github_document在Rmd文件中的某些R代码之前和之后指定文本(特别是div标签)。我似乎无法在前后工作。

例如编织以下内容:

---
title: "Untitled"
output: github_document
---

```{r setup, include=FALSE}
library(knitr)        
knit_hooks$set(toggle = function(before, options, envir) {
      if(options$toggle){
        if(before) {
          print('<div id="hideMe">')
        } else {
          print("</div>")
        }
      }
    })

```

## GitHub Documents


```{r pressure, echo=TRUE, toggle=TRUE}
# Here's some
```

产地:

Untitled
================

GitHub Documents
----------------

``` r
# Here's some
```

如果我删除else部分:

---
title: "Untitled"
output: github_document
---

```{r setup, include=FALSE}
library(knitr)        
knit_hooks$set(toggle = function(before, options, envir) {
      if(options$toggle){
        if(before) {
          print('<div id="hideMe">')
        } 
      }
    })

```

## GitHub Documents


```{r pressure, echo=TRUE, toggle=TRUE}
# Here's some
```

它按预期工作,我得到before部分:

Untitled
================

GitHub Documents
----------------

<div id="hideMe">

``` r
# Here's some
```

如果我在if语句中使用!before,则会显示尾随</div>。但是我无法同时显示前导和尾随部分。有什么建议可以在文本显示之前和之后 吗?

1 个答案:

答案 0 :(得分:1)

不要在块钩子中打印,返回要添加到文档中的文本:

  

在knitr中,钩子也可用于将文本插入输出。为此,钩子函数必须返回一个字符结果。 [Source]

您观察到的行为最可能的解释是,在R中,“if会返回已评估的表达式的值”(请参阅​​?Control部分“值”)。