动机:,我想写一个界面,它使用R包考试在学习问题/测验中的问题。在R/meta中,每个问题都是一个R/Markdown (Rmd)或R/LaTeX (Rnw)文件,具有指定问题、解决方案和进一步元信息的结构。这些问题可以包含R代码,使其具有动态性,例如采样编号或特定的文本构建块等。因此,问题首先通过knitr::knit或utils::Sweave运行,然后嵌入到合适的输出格式中。
Problem:当我从Rmd练习中动态生成一个问题或测试的学习教程rmarkdown::run("learnr+rexams.Rmd")时,我会得到以下错误:
if (grepl(not_valid_char_regex,label)) {:参数长度为零的错误
下面是一个简单的可复制示例learnr+rexams.Rmd的代码。导致此错误的原因似乎是因为learnr运行了一个函数verify_tutorial_chunk_label(),该函数试图确保learnr块标签的格式化良好。然而,混乱是由R/ that包运行的块造成的,不必要地导致了上面的错误。
Workarounds: --我可以在learnr命名空间中禁用verify_tutorial_chunk_label(),然后一切都正常工作。或者我可以使用Rnw代替Rmd练习,然后学习Or不与Sweave()冲突。另外,当我在学习教程之外运行我的代码时,它工作得很好。
的问题:,我能做些不那么有侵略性的事情,让exams和learnr合作吗?例如,设置一些适当的knitr选项或类似的东西?
示例:--这是复制问题的最小学习教程learnr+rexams.Rmd的源代码。请注意,所有内容都非常简单,只适用于某些R/ that练习,这里使用的是随R/ that附带的函数练习模板。
---
title: "learnr & R/exams"
output: learnr::tutorial
runtime: shiny_prerendered
---
```{r exams2learnr, include = FALSE}exams2learnr <-函数(文件){
X <- -考试::X考试(档案)[1][1]
X <- list(text =x$质询,type = "learnr_text",
learnr::answer(x$metainfo$solution, correct = TRUE))Do.call(学习::问题,x)
}
assignInNamespace("verify_tutorial_chunk_label",函数()返回(),ns = "learnr")
```{r rfunctions, echo = FALSE, message = FALSE}exams2learnr("function.Rmd")
运行本教程(如上所述)将复制错误。为了避免这种情况,我可以取消对assignInNamespace()调用的注释,或者将"function.Rmd"替换为"function.Rnw"。
发布于 2021-04-14 21:10:35
问题是,当learnr::question()被调用时,针织品就无法为调用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。
https://stackoverflow.com/questions/67066830
复制相似问题