在 bookdown 文档中使用 R/exams(特别是 HTML 输出)

2024-03-03

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

是否可以使用 R/exams (http://www.R-exams.org/ http://www.R-exams.org/)与预订?我主要对 HTML 输出感兴趣; PDF 输出是一个额外的好处,但并不是必需的。该网页承诺:

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

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

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

如果可能的话:如何?有什么指点吗?

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


一般说明

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

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

在 Markdown 中嵌入练习文本

当您在 R/Markdown (Rmd) 文件中编写练习时,您可以轻松地运行它们xexams()获得它们的一些随机版本。作为示例,让我们考虑数字 (num) 和单选 (schoice) 导数练习的版本,请参阅:deriv http://www.R-exams.org/templates/deriv/, deriv2 http://www.R-exams.org/templates/deriv2/. Using 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 的轻量级框架是webex https://CRAN.R-project.org/package=webex戴尔·巴尔 (Dale Barr) 和丽莎·德布鲁恩 (Lisa DeBruine) 设计的包装。

In webex您可以通过以下方式创建填空交互fitb()对于具有可选公差的数值解(num在 R/考试中)或用于字符解决方案(string在 R/考试中)。此外,您还可以通过以下方式创建下拉菜单交互mcq()对于单选题(schoice在 R/考试中)。(注:有关选择题的行话不统一:R/exams 所说的单项选择也称为多项选择。在这种情况下,多选题通常用于 R/exams 所说的多项选择。)

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

下面我简单说明一下如何嵌入schoice, num, and string中的问题webex。有关补充文件的更详细示例,请参阅下面的评论。还,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.css and webex.js从包装中。

进一步的变化

处理包含图像的练习时会涉及一些额外的工作,例如boxplots http://www.R-exams.org/templates/boxplots/。默认在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也是如此)。使用base64 = TRUE而不是FALSE下面将使用 Base 64 编码将补充 PNG 图像直接嵌入到 HTML 代码中。

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>"                                         
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 bookdown 文档中使用 R/exams(特别是 HTML 输出) 的相关文章

  • 使填充的值成为ggplot2中的实际填充

    有没有办法让填充的值 标签 成为填充本身 例如 在堆积条形图中 我有 require ggplot2 big votes movies movies movies votes gt 100000 p ggplot big votes mov
  • 如何避免循环

    大家好 我是 R 新手 我有两个面板数据文件 其中包含 id date 和 ret 列 文件 A 的数据比文件 B 多得多 但我主要处理文件 B 数据 id 和 date 的组合是唯一标识符 有没有一种优雅的方式来查找 B 中的每个 id
  • 如何使用 R / igraph 设置边缘颜色和顶点间距

    我是 R 新手 试图弄清楚如何为我有数据的系统制作社交网络地图 我已经设法从常见问题解答和教程中弄清楚我想做的大部分事情 但我被困在两件事上 如何使画布更大 图表间隔更大 现在已经太挤了 目前 边缘厚度是根据重量设置的 权重代表不同的状态
  • 如何将美国人口普查局的州级形状文件合并为全国性形状

    人口普查局不提供全国范围内公共使用微数据区域的形状文件 美国社区调查中可用的最小地理区域 我尝试用几种不同的方法将它们结合起来 但即使是消除重复标识符的方法一旦到达加利福尼亚州也会崩溃 我是在做一些愚蠢的事情还是需要一个困难的解决方法 下面
  • 尝试通过列表递归时,在 R 中出现错误“递归索引在级别 2 失败”

    当我尝试递归遍历图形顶点列表 将它们的值与列表中的一组颜色进行匹配时 出现错误 递归索引在级别 2 失败 我的颜色列表如下 colrs lt list l blue c red n gray50 然后我有一个 igraph 中的顶点列表vs
  • 如何在 R 中执行随机森林/交叉验证

    我无法找到对我尝试生成的回归随机森林模型执行交叉验证的方法 因此 我有一个数据集 其中包含 1664 个解释变量 不同的化学性质 和一个响应变量 保留时间 我正在尝试生成一个回归随机森林模型 以便能够预测给定保留时间的物质的化学性质 ID
  • 添加有关白天/黄昏/夜晚/黎明的信息以在 R 中跟踪数据

    我有一个数据集 其中包含几个月的日期时间 纬度和经度变量的跟踪数据 如下所示 gt start lt as POSIXct 2018 08 01 00 00 00 format Y m d H M S tz UTC gt datetime
  • 从 foreach 循环赋值

    我想并行化一个循环 例如 td lt data frame cbind c rep 1 4 2 rep 1 5 rep 1 10 2 names td lt c val id res lt rep NA NROW td for i in l
  • dplyr :过滤一系列行(在一列中)

    虚拟数据框 id family lt c 1 1 2 2 3 3 people lt c male female male female male children dataset lt data frame id family peopl
  • ggmap 错误:GeomRasterAnn 是使用不兼容版本的 ggproto 构建的

    我正在使用 ggmap 并收到以下错误 Error GeomRasterAnn was built with an incompatible version of ggproto Please reinstall the package t
  • 使用 gbuffer 在 R 中缓冲(地理)空间点

    我正在尝试缓冲数据集中半径为 100 公里的点 我正在使用该功能gBuffer从包装中rgeos 这是我到目前为止所拥有的 head sampledf postalcode lat lon city province 1 A0A0A0 47
  • 如何处理重叠的因子水平? (例如,生成表格和图表时)

    我面临一个数据集的问题重叠因素水平 我想按因素级别生成时间线 条形图和统计数据 但是 我希望因子水平是模棱两可的 这意味着属于多个级别的观察结果应该在图中出现多次 这是我的数据结构的示例 head lt c ID YEAR BRAZIL G
  • 为 RStudio Server 1.0.44 配置日志目录

    我在 CentOS 7 上运行 RStudio Server 1 0 44 根据文档 https support rstudio com hc en us articles 200554766 RStudio Server Applicat
  • 在 R 中使用 gamlss::lms 选择百分位数曲线

    我正在使用 gamlss 包中的示例代码来绘制百分位数曲线 library gamlss data abdom lms y x data abdom n cyc 30 它正在绘制自己的一组百分位数曲线 如何选择只绘制第 10 50 和 90
  • 使用列表中的数据框:删除变量,添加新变量

    定义一个列表dats有两个数据框 df1 and df2 dats lt list df1 data frame a sample 1 3 b sample 11 13 df2 data frame a sample 1 3 b sampl
  • 从 Cox PH 模型预测概率

    我正在尝试使用 cox 模型来预测时间 称为停止 3 后失败的概率 bladder1 lt bladder bladder enum lt 5 coxmodel coxph Surv stop event rx size number cl
  • 网页抓取(R 语言?)

    我想获取中间栏中的公司名称this http www consumercomplaints in bysubcategory mobile service providers page 1 html页面 以蓝色粗体书写 以及登记投诉者的位置
  • 在R中绘制3x3方形网格

    我得到了一个数字列表 n 9 想将它们画在一个 3 3 的正方形网格中 每个网格填充相应的数字 我如何在 R 中执行此操作而不安装额外的软件包 例如情节 非常感谢 这里有一个ggplot解决方案比我预期的要难一点 Setup the dat
  • left_join 表示列不存在,即使它存在

    我想用两个不同的变量 tp join 连接两个数据框 出现错误 表示无法在第二个数据帧中找到变量 但是当我运行函数 colnames 时 会显示列名称 为什么会这样呢 df new lt left join master settlemen
  • 用于更改向量中元素顺序的闪亮小部件

    在很多网站上 您都有一个拖放界面来更改列表中元素的顺序 我正在寻找类似的东西闪亮 我希望用户能够拖放列表中的元素 通过更改顺序来更改优先级 现在我有一个滥用的解决方案selectizeInput 这是可行的 但当选择列表变得更大时 它很快就

随机推荐

  • 使用 array_diff 比较两个数组

    我有以下代码 并尝试将两个数组与 array diff 进行比较 但我一直没有得到任何结果 我不确定这是否重要 但数组中有很多字段 我真的只想比较 1 个字段 这可能吗 我缺少什么
  • 如何在点击后隐藏横幅并使用本地存储保存?

    我是 Java 脚本新手 在用户单击 Cookie 横幅上的 接受 后 我不知道如何保存信息 本地存储 一旦他单击 接受 Cookie 横幅就会消失 我想保存因此 当他进入下一页或重新加载页面时 他不会再次收到 Cookie Banner
  • Bash - HTML 内容的正则表达式

    我正在学习 Bash 脚本 并且需要一些帮助来理解正则表达式 我有一个基本上是网页 html 的变量 使用 wget 导出 currentURL https www example com currentPage wget q O curr
  • 嵌套 TextBlock 和超链接,如何在 C# 中复制此 XAML?

    我有这个 XAML
  • 创建自定义 Object3D 类

    我是来自 AS3 Away3D 背景的 THREE js 新手 我正在尝试创建一个扩展 THREE Object3D 的自定义对象类以添加到我的场景中 CustomObject会封装很多行为属性和方法 理想情况下 我想传递每个 Custom
  • Android 下载管理器所有下载完成后如何通知

    我正在使用 Android 下载管理器类 所有下载完成后我需要写 下载完成 我尝试过一些东西并且它有效 但在这里 它是在逐个文件完成后写入的 我只需要写一次 全部完成后 我也尝试过没有光标 但我没能实现 public class Downl
  • XCode 链接到 OpenSSL 库

    我有一个需要链接 openssl 库的项目 尽管在编译时遇到了一些问题 include
  • Netbeans 7.2.1 损坏的参考:dist.jar(在 JavaFX 文件上编码时)

    我试图通过阅读一些教程来学习 JavaFX 但是 我什至无法实现 helloworld 应用程序 NetBeans 说道 错误 无法找到或加载主类 helloworld NewFXMain Java 结果 1 然后当我检查 属性 gt 库
  • pdf.js 只适用于某些 pdf 文件吗?

    我正在尝试使用将 pdf 页面转换为画布pdf js 我使用了答案使用 pdf js 和 ImageData 将 pdf 渲染到单个 Canvas https stackoverflow com questions 15341010 ren
  • 在 pandas 数据框中添加缺失的时间

    我有一个pandas DataFrame在列中带有时间戳 这些值以纪元为单位 间隔 0 1 秒 价值观如1488771900 100000 1488771900 200000等等 但是 存在缺失值 所以我有1488794389 500000
  • 将文件编码为 Base64 时内存不足

    使用 Apache commons 中的 Base64 public byte encode File file throws FileNotFoundException IOException byte encoded try FileI
  • C++:C 字符串集

    我想创建一个 以便我可以使用 set find 检查某个单词是否在集合中 然而 C 字符串是指针 因此默认情况下该集合将通过指针值来比较它们 为了正确运行 必须取消引用它们并比较字符串 我可以只向构造函数传递一个指向 strcmp 函数的指
  • Python Moviepy安装问题(Windows 7x64)

    美好的一天 我在为 python 64 位和 Windows 64 位安装 moviepy 时遇到问题 库安装成功 文件ffmpeg下载 每次我运行它或使用 video VideoFileClip path OSError WinError
  • FirebaseobserveSingleEvent 保留在内存中

    我的应用程序相当多地使用 firebase 的observeSingleEventOfType 我开始意识到我的应用程序的内存随着时间的推移而增加 我已经注释掉了所有代码 除了调用以下函数的测试按钮 func loadPostsTest F
  • Windows 版 Git 中的文件名太长

    我在用着Git 1 9 0 preview20140217对于 Windows 据我所知 这个版本应该可以解决文件名太长的问题 但不适合我 我肯定做错了什么 我做错了git config core longpaths true and gi
  • OnTriggerEnter() 未调用

    我有一个玩家 球体 和 4 个敌人 胶囊 所有敌人都添加了角色控制器 它们还有一个子 GameObject 它具有一个 RigidBody 无质量 无重力 和一个附加的 Box Collider 盒子碰撞器足够大 因此您可以看到盒子内部的球
  • yocto 中的机器特定层

    我想为一台新机器 称之为 A 添加一些从上游获取的层 主要是为了使用这些层提供的机器 A 配置文件 内核和 u boot 然而 新层有几个 bbappend 文件 还有 bb 文件 其版本与我的 yocto 项目中其他机器的层不同 例如 机
  • 如何让 Org-mode 在当前窗口中打开像 [[file://file.org]] 这样的链接而不是在其他窗口中默认打开?

    我希望使用 C c C o 打开一个链接 例如 file filename org filename 在当前窗口中 而不是在其他窗口中的默认值 如何更改此组织模式默认行为 似乎是默认的 C u C c C o 是在其他窗口中强制打开链接 这
  • 从具有相同方法签名的多个接口继承的类

    假设我有三个接口 public interface I1 void XYZ public interface I2 void XYZ public interface I3 void XYZ 继承这三个接口的类 class ABC I1 I
  • 在 bookdown 文档中使用 R/exams(特别是 HTML 输出)

    我使用 bookdown 创建了一本 书 我希望能够添加交互式测验 而不需要闪亮等 是否可以使用 R exams http www R exams org http www R exams org 与预订 我主要对 HTML 输出感兴趣 P