在学习者问题中使用 R/Markdown 失败

Using R/Markdown fails inside learnr question

动机:我想编写一个界面,使用R包中的问题exams in learnrquestions/quizzes。在 R/exams 中,每个问题都是一个 R/Markdown (Rmd) 或 R/LaTeX (Rnw) 文件,具有指定问题、解决方案和更多元信息的特定结构。问题可以包含 R 代码以使其动态化,例如,采样数字或某些文本构建块等。因此,工作流程是首先问题是 运行 到 knitr::knitutils::Sweave 和然后以合适的输出格式嵌入。

问题: 当我 rmarkdown::run("learnr+rexams.Rmd") 从 Rmd 练习中动态生成问题或测验的学习者教程时,我收到错误:

Error in if (grepl(not_valid_char_regex, label)) { : argument is of length zero

下面包含一个简单的可重现示例 learnr+rexams.Rmd 的代码。 错误的原因似乎是学习者 运行 的函数 verify_tutorial_chunk_label() 试图确保学习者 R 块标签的格式正确。但是,混淆是由 R/exams 包 运行 的块引起的,不必要地导致上述错误。

解决方法: 我可以禁用 learnr 命名空间中的 verify_tutorial_chunk_label(),然后一切正常。或者我可以使用 Rnw 而不是 Rmd 练习,然后 learner 不会与 Sweave() 冲突。此外,当我 运行 我的代码在学习者教程之外时它工作正常。

问题:我可以做一些不那么侵入性的事情来让examslearnr合作吗?例如,设置一些适当的 knitr 选项或类似的东西?

示例: 这是复制问题的最小学习者教程 learnr+rexams.Rmd 的来源。请注意,一切都非常简化,仅适用于某些 R/exams 练习,此处使用 R/exams.

附带的 function 练习模板
---
title: "learnr & R/exams"
output: learnr::tutorial
runtime: shiny_prerendered
---

```{r exams2learnr, include = FALSE}
exams2learnr <- function(file) {
  x <- exams::xexams(file)[[1]][[1]]
  x <- list(text = x$question, type = "learnr_text",
    learnr::answer(x$metainfo$solution, correct = TRUE))
  do.call(learnr::question, x)
}
## assignInNamespace("verify_tutorial_chunk_label", function() return(), ns = "learnr")
```

```{r rfunctions, echo = FALSE, message = FALSE}
exams2learnr("function.Rmd")
```

运行 本教程(如上所述)重现了该错误。为了避免它,我可以取消注释 assignInNamespace() 调用 或者 "function.Rmd" 替换为 "function.Rnw"

问题是在调用 learnr::question() 时,knitr 无法再找到调用 exams2learnr() 的块的块标签。您可以通过在调用 do.call(learnr_question, x):

之前设置当前块标签来解决这个问题
exams2learnr <- function(file, label = knitr::opts_current$get("label")) {
  force(label)
  x <- exams::xexams(file)[[1]][[1]]
  x <- list(
    text = x$question, 
    type = "learnr_text",
    learnr::answer(x$metainfo$solution, correct = TRUE)
  )
  knitr::opts_current$set(label = label)
  do.call(learnr::question, x)
}

这还允许您根据需要动态设置 label,这将成为 learnr 中问题的 ID。