在rmarkdown / knitr中的一个块之前和之后插入html代码

时间:2016-01-18 14:24:38

标签: r knitr r-markdown

我在rmarkdown文档中创建了一些R练习,但我不希望显示答案,除非用户点击按钮。

我设法使用以下代码执行此操作:

---
title: "Aula 01 - Exercícios"
date : 2016-01-18
layout: post
comments: true
tags: exercicio
category: exercicio
---

<script>
  var toggle = function(i) {
  var mydiv = document.getElementById('q' + i);
  if (mydiv.style.display === 'block' || mydiv.style.display === '')
    mydiv.style.display = 'none';
  else
    mydiv.style.display = 'block'
  }
</script>



1) Calcule o número de ouro no R.

$$ \frac{1 + \sqrt{5}}{2} $$

<div id="q1"  style="display:none;" >
```{r}
(1 + sqrt(5))/2
```
</div>

<button type = "button" onclick="toggle(1);" class = "btn btn-success">+</button>

这很好用,但我想我正在重复很多代码。当我有100个问题并决定更改按钮名称时,我会非常难过。

无论如何,我可以做类似的事情:

---
title: "Aula 01 - Exercícios"
date : 2016-01-18
layout: post
comments: true
tags: exercicio
category: exercicio
---

<script>
  var toggle = function(i) {
  var mydiv = document.getElementById('q' + i);
  if (mydiv.style.display === 'block' || mydiv.style.display === '')
    mydiv.style.display = 'none';
  else
    mydiv.style.display = 'block'
  }
</script>



1) Calcule o número de ouro no R.

$$ \frac{1 + \sqrt{5}}{2} $$

```{r, option_to_include_code}
(1 + sqrt(5))/2
```

所以knitr在转换为div之前包含必要的inputmarkdown

1 个答案:

答案 0 :(得分:6)

这是一种方式。这样:

  • 创建一个全局问题#counter和
  • 具有以下功能:

    • 将R表达式作为输入
    • 使用表达式“&amp;”吐出<div>回答&amp;按钮(格式由您决定)
    • 使用一些R降价代码块选项使其全部工作

你没有以这种方式获得R代码格式化,但如果你想在它上面工作,这实际上是可行的。

RPubs example output

---
title: "Aula 01 - Exercícios"
date : 2016-01-18
layout: post
comments: true
tags: exercicio
category: exercicio
---
```{r echo=FALSE}
library(htmltools)

q_num <- 1
q_inc <- function(q_exp) {
  q_num <<- q_num + 1
  return(div(div(id=sprintf("q%d", q_num-1), 
                 style="display:none;", 
                 pre(deparse(substitute(q_exp)), q_exp)),
              HTML(sprintf('<button type="button" onclick="toggle(%d);" class="btn btn-success">+</button>', 
                           q_num-1))))
}
```
<script>
  var toggle = function(i) {
  var mydiv = document.getElementById('q' + i);
  if (mydiv.style.display === 'block' || mydiv.style.display === '')
    mydiv.style.display = 'none';
  else
    mydiv.style.display = 'block'
  }
</script>



1) Calcule o número de ouro no R.

$$ \frac{1 + \sqrt{5}}{2} $$

```{r, echo=FALSE, results="markup"}
q_inc((1 + sqrt(5))/2)
```

2) Calcule o número de ouro no R again.

$$ \frac{2 + \sqrt{5}}{2} $$

```{r, echo=FALSE, results="markup"}
q_inc((2 + sqrt(5))/2)
```