在学习者问题中使用 R/Markdown 失败
Using R/Markdown fails inside learnr question
动机:我想编写一个界面,使用R包中的问题exams in learnrquestions/quizzes。在 R/exams 中,每个问题都是一个 R/Markdown (Rmd) 或 R/LaTeX (Rnw) 文件,具有指定问题、解决方案和更多元信息的特定结构。问题可以包含 R 代码以使其动态化,例如,采样数字或某些文本构建块等。因此,工作流程是首先问题是 运行 到 knitr::knit
或 utils::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()
冲突。此外,当我 运行 我的代码在学习者教程之外时它工作正常。
问题:我可以做一些不那么侵入性的事情来让exams
与learnr
合作吗?例如,设置一些适当的 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。
动机:我想编写一个界面,使用R包中的问题exams in learnrquestions/quizzes。在 R/exams 中,每个问题都是一个 R/Markdown (Rmd) 或 R/LaTeX (Rnw) 文件,具有指定问题、解决方案和更多元信息的特定结构。问题可以包含 R 代码以使其动态化,例如,采样数字或某些文本构建块等。因此,工作流程是首先问题是 运行 到 knitr::knit
或 utils::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()
冲突。此外,当我 运行 我的代码在学习者教程之外时它工作正常。
问题:我可以做一些不那么侵入性的事情来让exams
与learnr
合作吗?例如,设置一些适当的 knitr
选项或类似的东西?
示例: 这是复制问题的最小学习者教程 learnr+rexams.Rmd
的来源。请注意,一切都非常简化,仅适用于某些 R/exams 练习,此处使用 R/exams.
---
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。