knitr中的科学计数法:如何改进排版

6

knitr一直具有智能四舍五入的优秀特性,因此您可以避免许多sprintf/round/paste0的绕路。

有一个客户抱怨我给出的小数精度不正确,我注意到忘记为可能以科学计数法打印的数字加上“$$”非常危险。但是同一位客户抱怨我的科学计数法格式很丑,因为类似latex的数学公式与主字体不匹配。

scientific notation

根据@yihui在已关闭问题(https://github.com/yihui/knitr/issues/864)中的评论,需要使用$$。

是否有人有智能解决方案?目前,我回到了旧日的sprintf格式化。

---
output: 
  html_document:
    theme: cosmo
---

I use the cosmo theme because it shows the typographic problem more clearly.

```{r}
options(digits=2)
mean = c(2.31310934, 1.23456e-7)
std = c(0.31310934, 6.54321e-7)
```

digits is `r getOption("digits")`

The mean is `r mean[1]` with a standard deviation of `r std[1]`.

This looks good

The mean is `r mean[2]` with a standard deviation of `r std[2]`.

Note that the aboves looks like "1.23510".

The mean is $`r mean[2]`$ with a standard deviation of $`r std[2]`$.

你会考虑更改文档的字体以匹配MathJax的输出吗?这似乎更容易。我相信你只需要几行CSS代码来选择STIX字体。 - baptiste
Brr... 回到UNIX六十年代的外观?不是我喜欢的。 - Dieter Menne
1个回答

4

您可以重新定义inline输出钩子,以避免许多显式的sprintf/round/paste0操作...

knitr::knit_hooks$set(inline = function(x) {
  knitr:::format_sci(x, 'md')
})

这将使用形式为1.23 × 10^-7^的科学计数法语法,如果您的输出格式仅限于HTML,则应该可以正常工作。

对于特定类型的输出格式来说,这是一个简单的问题,但是当您希望数字格式在所有格式中都能够移植,包括HTML、Word、LaTeX等等时,它就变得难了。这就是为什么在knitr 1.7中需要使用$ $的原因。


谢谢,Yihui,这应该是一个解决方案。你可能不应该把它隐藏在文档的“小点”下面,我相信在接下来的一周里会有更多的人被这个改变所困扰。是否有可能将上述钩子作为HTML的默认值,并在其他格式中未使用$$时发出警告呢? - Dieter Menne
在某种程度上,我同意这不是一个小的变化。然而,我不能把上面的钩子设置为HTML的默认值,因为那样会导致使用 $ $ 标识他们的数字的人失败。考虑到可移植性,唯一的解决方案是不得不要求使用 $ $ - Yihui Xie

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接