.Rmd 练习文件中的 round() 函数有问题

Problem with round() function in .Rmd exercise file

我在为练习创建 .Rmd 文件时遇到问题,我将大量数字与 round() 函数一起包含在内。这是一个最小的例子:

```{r data generation, echo = FALSE, results = "hide"}
Value = 12000.555
```

Question
========
temp

Meta-information
================
exname: temp
extype: num
exsolution: `r round(Value, 2)`
extol: 0.01

我尝试使用 exams2pdf() 将此练习编译成考试,但出现以下错误:

exams2pdf("example.Rmd")
## Warning message: In read_metainfo(file) : NAs introduced by coercion

这是为什么?我正在使用 R/exams 2.3-6 版和 R 3.6.3 版。

TL;DR:使用 fmt(Value, 2) 而不是 round(Value, 2)。这避免了科学记数法的问题(并使用从零开始的四舍五入)。有关详细信息,请参阅 ?fmt

错误的原因实际上不是 round() 函数本身,而是 R 默认情况下对具有一定有效数字位数的数字使用科学记数法(R 中的出厂默认值是scipen = 7)。此外,knitr 包(由 R/exams 在后台使用)试图很好地格式化这个科学记数法。因此,knit() 函数在 Markdown 文件中包含 1.200056 &times; 10<sup>4</sup> 而不是 12000.56。当您 运行 xweave("example.Rmd") 然后检查生成的 example.md 文件时,您可以看到这一点。然后 exsolution 标签的后续处理因此在将其转换回数字时出现问题,因此出现警告。

为避免这种情况,您可以在练习的 R 代码中增加 scipen 限制,例如 options(scipen = 999)。但这是非常技术性和乏味的。这是我们编写 fmt(...) 函数的原因之一,该函数执行各种与 R/exams 练习中的数字格式相关的便利任务。