首页 > 解决方案 > 在 bookdown 文档中使用 R/exams(尤其是 HTML 输出)

问题描述

我使用 bookdown 创建了一本“书”。我希望能够添加交互式测验,而不需要闪亮等。

是否可以将 R/exams ( http://www.R-exams.org/ ) 与 bookdown 一起使用?我主要对 HTML 输出感兴趣;PDF 输出有好处,但几乎不是必需的。该网页提供了承诺:

基于(可能)动态练习模板,可以为各种系统创建大量个性化考试/测验/测试:[...] 以及创建自定义输出(PDF、HTML、Docx...)的可能性。

练习类型包括选择题或单选题、数字或文本答案,或这些的组合。格式化可以在 Markdown 或 LaTeX 中完成,并且可以使用 R 生成动态内容,例如随机数、图形、数据集或打乱的文本块。

听起来不错。有谁知道是否可以使用带有 bookdown 的考试(即使只是一些功能)?

如果可能:如何?任何指针?

如果不可能:有人知道做类似事情的方法吗?

标签: rbookdownr-exams

解决方案


一般说明

R/exams 确实是可扩展的,利用它的构建块相对容易。exams2xyz()调用所有接口底层的主力函数xexams()。它分四个步骤进行:

  1. sweave:练习文件被复制到一个临时目录,然后通过 R 运行,默认情况下使用它为(对于 Rnw 文件)和(对于 Rmd 文件)xweave()提供统一的便利接口。utils::Sweave()knitr::knit()
  2. read:将生成的编织文件读入 R,默认情况下使用read_exercise(). 对于每个练习,这会产生一个questionquestionlistsolutionsolutionlistmetainfo、 和的列表supplements。所有元素始终存在,但可能为空,例如,当练习中没有提供解决方案环境或没有补充文件时。
  3. transform:默认为空,但可用于将上面的练习列表元素转换为所需的格式,例如 HTML。
  4. write:默认情况下为空,但可用于写出每次n重复考试的结果。

在 Markdown 中嵌入练习文本

当您在 R/Markdown (Rmd) 文件中编写练习时,您可以轻松地运行它们xexams()以获得它们的一些随机版本。例如,让我们考虑导数练习的数字 ( num) 和单选 ( schoice) 版本,请参阅:derivderiv2。使用1作为随机种子,数值练习具有以下问题以及正确的解决方案和容差:

set.seed(1)
d1 <- xexams("deriv.Rmd")[[1]][[1]]
d1$question
## [1] "What is the derivative of $f(x) = x^{2} e^{2.3 x}$, evaluated at $x = 0.56$?"
d1$metainfo$solution
## [1] 6.68
d1$metainfo$tolerance
## [1] 0.01

索引的原因[[1]][[1]]是,这是来自第一次(也是唯一一次)考试,第一次(也是唯一一次)练习。例如,如果您生成,xexams(..., n = 3)那么第一个索引可能在 1、2、3 中。类似地,如果您愿意,您可以包含多个练习。

单选版有

set.seed(1)
d2 <- xexams("deriv2.Rmd")[[1]][[1]]
d2$question
## [1] "What is the derivative of $f(x) = x^{2} e^{2.3 x}$, evaluated at $x = 0.66$?"
## [2] ""                                                                            
d2$questionlist
## [1] "$8.01$"  "$14.09$" "$10.59$" "$15.35$" "$6.02$" 
d2$metainfo$solution
## [1] FALSE FALSE  TRUE FALSE FALSE

这两者都可以很容易地作为静态文本集成到任何 R/Markdown 文档中。

嵌入练习文本webex

要将静态文本转换为 HTML 中的动态元素,例如,读者可以在其中输入数字的文本字段,然后将其与解决方案中的参考值进行比较,可以使用 Javascript。用于生成此类输出的一种基于 R 的轻量级框架是Dale Barr 和 Lisa DeBruine 的webex包。

在您可以通过具有可选容差的数字解决方案(在 R/exams 中)或字符解决方案(在 R/exams 中)webex创建填空交互。此外,您可以通过单选题(在 R/exams 中)创建下拉菜单交互。(注意:关于选择题的术语并不统一:R/exams 所说的单选题也称为多项选择题。在这种情况下,多选题通常用于 R/exams 所说的多项选择题。)fitb()numstringmcq()schoice

目前,webex不支持单选按钮作为下拉菜单的替代品。此外,多项选择(也称为多项答案)问题的复选框不可用。

下面,我将schoice说明num如何stringwebex. 有关补充文件的更详细示例,请参阅下面的评论。此外,cloze这也是可行的,但需要更多的工作。

---
title: "Web Exercises with R/exams & webex"
output: webex::webex_default
---

```{r setup, include = FALSE}
knitr::opts_chunk$set(echo = TRUE)
library("webex")
library("exams")
```

`r style_widgets("#DF536B", "#61D04F")`

## `schoice`

```{r swisscapital, echo = FALSE, results = "asis"}
x <- xexams("swisscapital.Rmd")[[1]][[1]]
names(x$questionlist) <- ifelse(x$metainfo$solution, "answer", "")

x <- c(
  x$question,
  "",
  mcq(x$questionlist),
  "",
  hide("Correct solution"),
  "",
  x$solution,
  "",
  paste("*", x$solutionlist),
  "",
  unhide()
)
writeLines(x)
```

## `num`

```{r deriv, echo = FALSE, results = "asis"}
x <- xexams("deriv.Rmd")[[1]][[1]]

x <- c(
  x$question,
  "",
  fitb(x$metainfo$solution, tol = x$metainfo$tol,
    width = min(100, max(20, nchar(x$metainfo$solution)))),
  "",
  hide("Correct solution"),
  "",
  x$solution,
  "",
  unhide()
)
writeLines(x)
```

## `string`

```{r function, echo = FALSE, results = "asis"}
x <- xexams("function.Rmd")[[1]][[1]]

x <- c(
  x$question,
  "",
  fitb(x$metainfo$solution, width = min(100, max(20, nchar(x$metainfo$solution)))),
  "",
  hide("Correct solution"),
  "",
  x$solution,
  "",
  unhide()
)
writeLines(x)
```

渲染它rmarkdown::render()会给你一个文件,如下面的屏幕截图所示。嵌入时,bookdown您需要确保嵌入包中的webex.cssand webex.js

网迅

进一步的变化

在处理包含诸如线图之类的图像的练习时,会涉及一些额外的工作。默认xexams()设置为 PDF 输出,但driver$sweave可以调整以生成 PNG 输出。在任何一种情况下,supplements都是补充文件的文件路径向量:

set.seed(1)
b1 <- xexams("boxplots.Rmd", driver = list(sweave = list(png = TRUE)))[[1]][[1]]
b1$question
## [1] "In the following figure the distributions of a variable"             
## [2] "given by two samples (A and B) are represented by parallel boxplots."
## [3] "Which of the following statements are correct?  _(Comment: The"      
## [4] "statements are either about correct or clearly wrong.)_"             
## [5] "\\"                                                                  
## [6] "![](boxplot-1.png)"                                                  
## [7] ""                                                                    
b1$supplements
##                                                      boxplot-1.png 
## "/tmp/RtmpA07Hau/file11d77d212e69bf/exam1/exercise1/boxplot-1.png" 
## attr(,"dir")
## [1] "/tmp/RtmpA07Hau/file11d77d212e69bf/exam1/exercise1"

此外,您可以设置一个transform将 R/Markdown 转换为 HTML 的驱动程序(而不是bookdown稍后再执行此操作)。在这里,我选择pandoc作为转换器,使用 MathJax 来呈现数学内容(bookdown也一样)。使用Base 64 编码将补充 PNG 图像直接嵌入 HTML 代码中,base64 = TRUE而不是使用下面的。FALSE

set.seed(1)
htmltrafo <- make_exercise_transform_html(converter = "pandoc-mathjax", base64 = FALSE)
b2 <- xexams("boxplots.Rmd", driver = list(sweave = list(png = TRUE), transform = htmltrafo))[[1]][[1]]
b2$question
## [1] "<p>In the following figure the distributions of a variable given by two samples (A and B) are represented by parallel boxplots. Which of the following statements are correct? <em>(Comment: The statements are either about correct or clearly wrong.)</em><br />"
## [2] "<img src=\"boxplot-1.png\" /></p>"                                         

推荐阅读