如何处理 R 考试中随机选择的图形文件以导出到 qti 和 moodle?
How do I handle randomly selected graphics files in R exams for export to qti and moodle?
我有一个试题电子表格,我想用它来使用 R exams
生成测验和考试,我想在一些试题中包含图形。
此处的模板 (http://www.r-exams.org/templates/fruit/) 首先将图像定义为由
生成的长 base 64 编码字符串
base64enc::base64encode("file.png")
这看起来不错,但如果我有十几张图像,我可能只想使用随机选择的一张、两张或三张图像来进行编程生成的练习,我该如何避免包含编码对于每一个练习的所有十几张图片?
目前我能想到的最好办法是在可能的问题选项电子表格中包含用于图形包含的 LaTeX 语法,并在生成练习时使用正则表达式在 \includegraphics{}
将包含的命令,将它们编码为 base 64 字符串,并将它们包含在练习文件中,但我想知道是否有一种方法可以在不编写自己的代码来解析 LaTeX 的情况下执行此操作。
首先说明几点:
fruit
练习包括图像作为 Base64 字符串,因为三个图标非常小(每个图标 12K)并且在 Rnw/Rmd 中包含所有信息很方便练习而不需要单独存储图形文件。这只是一个非常巧妙的技巧,也是我们想要展示的。
对于更多更大的图像,可以做同样的事情,但可能不太方便。为了说明如何在练习中包含静态图像,可以使用以下模板: http://www.R-exams.org/templates/Rlogo/ 它使用 include_supplement()
函数声明某个文件作为练习的补充。如果这是一个图形,则可以通过 Rnw 练习中的 \includegraphics{...}
和 Rmd 练习中的 
将其集成到练习中。
每个练习只需要包括它实际使用的补充(而不是所有从中采样的文件)。并且无需手动进行 Base64 编码。如果需要,这是由 exams2xyz(...)
函数自动完成的。
现在针对您描述的场景。假设你有一个练习 foo.Rmd
,你想在其中显示三个静态图像 foo-1.png
、foo-2.png
、foo-3.png
之一并提出有关它的问题。那么你的 R 代码可能会做类似的事情:
i <- sample(1:3, 1)
img <- paste0("foo-", i, ".png")
include_supplement(img)
随机选择三个文件之一并将其声明为附件。然后在问题文本中,您可以通过以下方式包含图像:

注意事项:
上面的代码假定 PNG 图像位于与 Rmd 练习本身相同的目录中。如果它在子目录中 bar/
说,你需要 include_supplement(img, dir = "bar")
等
如果将此练习呈现为 HTML,则原始文件名(foo-1.png
或 foo-2.png
或 foo-3.png
)将在HTML 源代码。这可能(或可能不会)为学生提供正确答案的提示。如果是这样,最好包含具有中性名称的文件,例如 include_supplement(img, target = "foo.png")
.
在 Rnw 练习中,包含图形的代码类似于:\includegraphics{\Sexpr{img}}
.
我有一个试题电子表格,我想用它来使用 R exams
生成测验和考试,我想在一些试题中包含图形。
此处的模板 (http://www.r-exams.org/templates/fruit/) 首先将图像定义为由
生成的长 base 64 编码字符串base64enc::base64encode("file.png")
这看起来不错,但如果我有十几张图像,我可能只想使用随机选择的一张、两张或三张图像来进行编程生成的练习,我该如何避免包含编码对于每一个练习的所有十几张图片?
目前我能想到的最好办法是在可能的问题选项电子表格中包含用于图形包含的 LaTeX 语法,并在生成练习时使用正则表达式在 \includegraphics{}
将包含的命令,将它们编码为 base 64 字符串,并将它们包含在练习文件中,但我想知道是否有一种方法可以在不编写自己的代码来解析 LaTeX 的情况下执行此操作。
首先说明几点:
fruit
练习包括图像作为 Base64 字符串,因为三个图标非常小(每个图标 12K)并且在 Rnw/Rmd 中包含所有信息很方便练习而不需要单独存储图形文件。这只是一个非常巧妙的技巧,也是我们想要展示的。对于更多更大的图像,可以做同样的事情,但可能不太方便。为了说明如何在练习中包含静态图像,可以使用以下模板: http://www.R-exams.org/templates/Rlogo/ 它使用
include_supplement()
函数声明某个文件作为练习的补充。如果这是一个图形,则可以通过 Rnw 练习中的\includegraphics{...}
和 Rmd 练习中的
将其集成到练习中。每个练习只需要包括它实际使用的补充(而不是所有从中采样的文件)。并且无需手动进行 Base64 编码。如果需要,这是由
exams2xyz(...)
函数自动完成的。
现在针对您描述的场景。假设你有一个练习 foo.Rmd
,你想在其中显示三个静态图像 foo-1.png
、foo-2.png
、foo-3.png
之一并提出有关它的问题。那么你的 R 代码可能会做类似的事情:
i <- sample(1:3, 1)
img <- paste0("foo-", i, ".png")
include_supplement(img)
随机选择三个文件之一并将其声明为附件。然后在问题文本中,您可以通过以下方式包含图像:

注意事项:
上面的代码假定 PNG 图像位于与 Rmd 练习本身相同的目录中。如果它在子目录中
bar/
说,你需要include_supplement(img, dir = "bar")
等如果将此练习呈现为 HTML,则原始文件名(
foo-1.png
或foo-2.png
或foo-3.png
)将在HTML 源代码。这可能(或可能不会)为学生提供正确答案的提示。如果是这样,最好包含具有中性名称的文件,例如include_supplement(img, target = "foo.png")
.在 Rnw 练习中,包含图形的代码类似于:
\includegraphics{\Sexpr{img}}
.