【问题标题】:How do I change the decimal separator in r-exams question to comma?如何将 r-exams 问题中的小数点分隔符更改为逗号?
【发布时间】:2020-09-23 11:41:55
【问题描述】:

我正在尝试在使用“r-exams/sweave”创建的问题中显示逗号作为小数点分隔符。但是,我无法加载 siunitx 包或进行任何其他允许此更改的配置。我打算使用函数exams2moodle 将问题导出到moodle。

【问题讨论】:

  • 您好,希望下面的回答对您有用。如果是这样,请单击左侧投票计数器下方的复选标记接受它。如果没有,请评论仍然不清楚的地方。

标签: sweave r-exams


【解决方案1】:

通过 LaTeX 包

只有当输出是通过 LaTeX 生成的(例如,exams2pdf 等)时,才能使用像 siunitxicomma 这样的 LaTeX 包。但是,当 LaTeX 代码转换为 HTML 时(例如,exams2moodle),我不知道将带小数点的数字转换为小数点逗号的通用解决方案。

通过 R 中的 options(OutDec = ",")

但是,相对简单的是在 R 中设置 options(OutDec = ",")。这可以工作,前提是:

  1. 所有相关数字要么用逗号硬编码在文本中,要么分别用r ...\Sexpr{...} 动态生成,
  2. 确保num 练习中的exsolution 仍然使用小数点。

例如,考虑schoice 练习deriv2。它满足以上两项:1.所有数字都是从R动态插入的,2.它不是num练习。

library("exams")
options(OutDec = ",")
exams2html("deriv2.Rmd")

同样适用于 Rnw 版本的练习。

如果练习应该总是产生带逗号的数字,您还可以在练习文件开头的第一个代码块中包含options(OutDec = ","),然后在代码块在最后。

也可以使用num 练习deriv。但是为了确保第 2 项,您需要在 exsolution 中写入 fmt(res, decimal.mark = ".") 而不是只写 fmt(res),或者在添加元信息之前恢复为 options(OutDec = ".")

通过 R 中的fmt(..., decimal.mark = "{,}")

上述方法的一个小缺点是,注重细节的观众可能会注意到在 LaTeX 数学模式$...$ 中,逗号后插入了一个小空格。有关示例,请参见上面的屏幕截图。

如果您想避免这种情况,则需要使用{,} 作为小数分隔符。不幸的是,options(OutDec) 不支持这一点,因为它需要是长度为 1 的字符串。此外,OutDec 可能还不够,因为数学模式中的数字需要 {,} 而纯文本中的数字只需要 ,

在这种情况下,最简单的解决方案是将options(OutDec) 保留为系统默认值。而是在数学模式中使用 fmt(..., decimal.mark = "{,}") 和在纯文本中使用 fmt(..., decimal.mark = ",")。为了减少打字,您还可以添加两个便利功能,例如:

cfmt <- function(x, ...) fmt(x, ..., decimal.mark = ",")
mfmt <- function(x, ...) fmt(x, ..., decimal.mark = "{,}")

如果您想自己处理任何舍入,也可以使用函数base::format(..., decimal.mark = ...),而不是在exams::fmt() 函数上构建。

要求

请注意,将 decimal.mark 传递给 fmt() 至少需要 R/exams 的 2.4-0 版本。在撰写本文时,这是 R-Forge 提供的当前开发版本,但很快将发布到 CRAN。

【讨论】:

  • 抱歉,您需要使用当前开发版本的包(即将发布到 CRAN)。我忘了我是在上次发布后添加了这个功能。只需运行:install.packages("exams", repos="http://R-Forge.R-project.org")
  • 回复:没有任何改变。重新安装软件包后是否正确地重新加载了软件包?我建议尝试新会话并确保 packageVersion("exams") 为 2.4-0。回复:逗号。在 Moodle 中无法加载额外的 LaTeX 包,请参阅 tex.stackexchange.com/questions/545491/…。不幸的是,在 R 中无法设置 OutDec = "{,}"。因此,作为替代方案,保持OutDec 不变(即".")并改用fmt(..., decimal.mark = "{,}")
  • 作为个人评论:我很欣赏对细节的关注,这些细节是我个人喜欢使用 LaTeX 的原因 - 但我怀疑你的许多学生在考试中是否关心它。这就是为什么我不费心进行这种微调的原因。尽管在德语中您也可以使用小数点逗号,但我在所有书籍、幻灯片、练习等中都使用小数点。只要学生输入的解决方案中正确接受了逗号和点(就是这种情况)在 Moodle 中)我从来没有遇到过任何问题。 (当然,如果你的优先级不同也没关系!)
  • 我添加了decimal.mark = "{,}" 解决方案,并对答案进行了一些进一步的解释。我希望这涵盖了所有相关方面。
  • 我已经编辑了我的答案以帮助简化修改。回复:使包自动执行此操作。我没有看到一种足够简单和强大的方法来做到这一点。替换所有“。”使用 "," 或 "{,}" 很困难,因为必须检测数学模式,更重要的是,"."可能被用作更难自动检测的千位分隔符。因此,运动作者真的必须照顾它。我的回答应该提供足够的细节,以便他们可以做出明智的选择,什么最适合他们。如果您觉得这仍然不是“可接受的”,那当然取决于您。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-02-19
  • 1970-01-01
  • 2021-12-25
  • 1970-01-01
  • 2022-01-17
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多