从R笔记本输出Rmarkdown

时间:2019-08-26 16:39:18

标签: r rstudio r-markdown knitr

当我从Rstudio编织笔记本时,我想从笔记本中输出Rmarkdown(原因如下)。我可以几乎得到我想要的东西,例如:

---
title: "Homework"
output:
  html_document:
    keep_md: true
    md_extensions: +backtick_code_blocks
---

```{r setup, include=FALSE}
knitr::opts_chunk$set(eval = FALSE, echo = TRUE)
```

Fill the function:

```{r echo=-3}
is_even = function(n) {
  # TODO
  n %% 2 == 0
}

if(is_even(8)) {
  print("correct!")
} else {
  print("wrong!")
}
```

生成的markdown文件几乎是 正确:

Fill the function:

```r
is_even = function(n) {
  # TODO
}

if(is_even(8)) {
  print("correct!")
} else {
  print("wrong!")
}
```

我只需要一种方法即可将代码块前导从r替换为{r}。我可以只运行sed,但如果可以的话,我想在RStudio中进行编织。

用例:编码分配。写一个包含问题和答案的文件,并在编织时将答案剥离掉,这样我就可以将所得的减价(没有答案)提供给学生。然后,他们可以在Rstudio中打开它并填写所需的内容。

1 个答案:

答案 0 :(得分:0)

它使用 ```r而不是 ```{r}输出文件的原因是因为它是降价文件而不是rmarkdown文件,因此只是markdown语法不同。

但是,如果您在R中打开该文件,则仍然可以运行代码,因此这并不是真正的问题。

然后,如果您的目标是将Rmarkdown文件提供给您的学生,那么代码块看起来就像他们在原始文件中所做的那样,那就有办法了。

无论哪种方式,您都应该使用“ md_document”输出,因为据您所知,您将不会使用html文件。

您的标题应该是:

---
output:
  md_document:
    variant: 'markdown+backtick\_code\_blocks'
title: Homework
---

将输出一个.md文件,如:

---
output:
  md_document:
    variant: 'markdown+backtick\_code\_blocks'
title: Homework
---

Fill the function:

``` {.r}
is_even = function(n) {
  # TODO
}

if(is_even(8)) {
  print("correct!")
} else {
  print("wrong!")
}
```    

标头现在具有'{.r}',因为它指示元素具有类r(同样是md语法)

如果要在.Rmd中添加它,则需要将语法更改为rmd语法。为此,您只需删除“。”在“ {.r}”中,可以轻松添加:

```{r eval=TRUE, include=FALSE}
system2("sed", "-e 's/{.r}/{r}/' Homework.md", stdout = 'Homework_out.Rmd')
```

您可以更改输出文件名,我将其命名为“ Homework_out.Rmd”,因为我假设您的原始.Rmd被命名为“ Homework.Rmd”。

生成的.Rmd将如下所示:

---
output:
  md_document:
    variant: 'markdown+backtick\_code\_blocks'
title: Homework
---

Fill the function:

``` {r}
is_even = function(n) {
  # TODO
}

if(is_even(8)) {
  print("correct!")
} else {
  print("wrong!")
}
```