首页 > 解决方案 > .Rmd 练习文件中的 round() 函数存在问题

问题描述

我有一个问题,我为练习创建了一个 .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。

标签: r-exams

解决方案


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

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

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


推荐阅读