从 R 笔记本输出 Rmarkdown

3

当我在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内编织时完成所有操作。

用例:编码作业。编写一个包含问题和答案的单个文件,并在编织时剥离答案,以便我可以将结果的markdown(不带答案)提供给学生。然后他们可以在Rstudio中打开它并填写所需内容。


我不完全确定我是否理解你的意思,但也许如果你想将问题与答案分开,你可以使用子表单?类似这样的东西?https://yihui.name/knitr/demo/child/ 或者你是想创建一个能够输出markdown文件的markdown文件吗? - Amit Kohli
1
在他们的帖子底部,@AmitKohli说他们想要一个单一的文件。当父文件编译时,具有子文件的功能很少被使用,但这并不能满足他们的问题。他们想要创建一个能够输出markdown文件的markdown文件。 - AcademicDialysis
1
所以我还有点困惑。在你的代码中,问题似乎是脚本输出了 r 而不是 {r},但你没有提供任何用于输出你的 rmarkdown 的代码,只有 markdown 输出本身。对我来说更有趣的问题是如何通过编程方式删除答案...从发布的示例中看起来并不容易或系统化... - Amit Kohli
@AmitKohli 抱歉没有说明清楚。我是在使用knitr的Rstudio中编写笔记本的。包括子文件可能会起作用,但这会使开发任务有点繁琐。 - BlackBear
1个回答

0

输出文件中出现 ```r而不是 ``` {r}的原因是它是一个Markdown文件而不是Rmarkdown文件,因此该语法不同。

但是,如果您在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!")
}
```

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接