RStudio Knit时科学计数法输出报错,如何解决?
Fixing LaTeX Compilation Error with Scientific Notation in R Markdown PDF
这个报错的核心原因很明确:当计算1 - 0.9999时,R默认输出了科学计数法格式的1e-04,而LaTeX会把这个格式里的e误认为是需要数学环境的指数命令(类似\times的用法),但你没有把这段数值包裹在数学公式的$...$标记里,所以就触发了"Missing $ inserted"的编译错误。
这里有几个简单有效的解决办法,你可以根据需求选择:
1. 格式化数值为普通小数
直接把计算结果转换成固定位数的小数格式,彻底避免科学计数法。可以用sprintf()或者formatC()来精准控制输出:
My favorite number is `r sprintf("%.4f", 1 - 0.9999)`
或者:
My favorite number is `r formatC(1 - 0.9999, format = "f", digits = 4)`
这两种写法都会输出0.0001,LaTeX可以直接识别,不会报错。
2. 把科学计数法内容放在数学环境中
如果想要保留科学计数法的显示形式,只需要把数值包裹在LaTeX的数学环境标记$里,让LaTeX正确解析这个科学计数法:
My favorite number is $`r 1 - 0.9999`$
编译后会显示成标准的数学式科学计数形式,完全符合LaTeX的语法要求。
3. 全局禁用科学计数法
如果你的整个文档都不希望出现科学计数法的输出,可以在setup代码块里添加全局设置:
knitr::opts_chunk$set(echo = TRUE) options(scipen = 999) # 数值越大越优先使用普通小数
scipen参数控制R对科学计数法的偏好程度,设置为999后,几乎所有情况下R都会输出普通小数而非科学计数法,一劳永逸解决这类问题。
内容的提问来源于stack exchange,提问作者Ben S.




