强制 R 不使用指数符号(例如 e+10)?

Posted

技术标签:

【中文标题】强制 R 不使用指数符号(例如 e+10)?【英文标题】:Force R not to use exponential notation (e.g. e+10)? 【发布时间】:2012-02-22 15:24:33 【问题描述】:

我可以强制 R 使用常规数字而不是使用类似 e+10 的符号吗?我有:

1.810032e+09
# and 
4

在同一个向量内想看:

1810032000
# and
4

我正在为一个老式程序创建输出,我必须使用cat 编写一个文本文件。 到目前为止效果很好,但我根本不能在那里使用e+10 表示法。

【问题讨论】:

相关:***.com/q/3978266/134830 【参考方案1】:

这是一个灰色地带。你需要记住,R 总是会调用一个 print 方法,而这些 print 方法会监听一些选项。包括“scipen”——对科学展示的惩罚。来自help(options)

‘scipen’:整数。决定打印时要施加的惩罚 固定或指数表示法的数值。积极的 价值观偏向固定,负向科学 符号:固定符号将是首选,除非它更多 比‘scipen’数字更宽。

例子:

R> ran2 <- c(1.810032e+09, 4) 
R> options("scipen"=-100, "digits"=4)
R> ran2
[1] 1.81e+09 4.00e+00
R> options("scipen"=100, "digits"=4)
R> ran2
[1] 1810032000          4

也就是说,我仍然觉得它值得做。最直接的方法是使用具有显式宽度的sprintf(),例如sprintf("%.5f", ran2).

【讨论】:

谢谢。 scipen 似乎是我正在寻找的选项。令人毛骨悚然的惩罚解释让我回避了。但是你的例子很好地解释了它。 sprintf,嗯?你是指一周前我用 sprintf 遇到的麻烦吗? :) 在 rstudio 中,如果您导入数据集并执行 train_sample_10k = format(train_sample_10k,scientific=FALSE) 并重新加载,它将改变科学记数法。 完成此操作后如何恢复正常? @CSA: options("scipen"=0, "digits"=7)(这些是默认值) 您应该将达到结果options("scipen"=100, "digits"=4) 的那个移到代码的顶部,而没有低于它的那个......并带有适当的注释。寻找快速解决方案的人可能会感到困惑(Google 会显示第一个作为结果)。【参考方案2】:

可以通过禁用R中的科学记数法来实现。

options(scipen = 999)

【讨论】:

此外,这可以放在您的.Rprofile file 中,因此默认情况下会自动执行。【参考方案3】:

我最喜欢的答案:

format(1810032000, scientific = FALSE)
# [1] "1810032000"

这可以提供您想要的东西,而无需在 R 设置中搞砸。

注意它返回的是字符串而不是数字对象

【讨论】:

嗯,这很奇怪,它对我不起作用。我没有收到错误,它仍然会打印科学符号。 不确定是什么问题。我签入了一个非常旧的(3.1.0)和新的(3.4.3)版本的 R,它对我来说都适用。很可能某处的其他设置优先,或者您在 R 中发现了特定于版本或边缘情况的错误。您是否有可能以科学记数法而不是数字对象向它提供字符串?这样就可以解释了。 也许值得注意的是,这会创建一个字符而不是数字。 如果向量中的数字长度不同,请务必使用justified = "none",否则会有空格将它们填充到相同的长度。 format(1e6, scientific=FALSE) 返回"1000000"as.character(1e6) 返回"1e+06",所以这两种方法是有区别的。【参考方案4】:

options(scipen = 999) 放入您的.Rprofile file,以便默认自动执行。 (不要依赖手动操作。)

(这与其他答案不同:如何?

    当您每天或每月在多个项目、多种语言之间切换时,这会让事情保持清醒。记住输入每个项目的设置很容易出错并且不可扩展。您可以拥有一个全局的 ~/.Rprofile 或每个项目的 .Rprofile。或两者兼而有之,后者覆盖前者。 将所有配置保存在项目范围或全局 .Rprofile 中会自动执行它。这对例如有用默认包加载、data.table 配置、环境等。同样,该配置可以运行到设置页面,您记住这些及其语法并输入它们的可能性为零

【讨论】:

为什么答案完全一样? ***.com/a/27318351/680068 除了 Rprofile 位,也许更好地编辑 GingerJack 的答案? @zx8754:答案并不完全相同:关键是将这些东西移到你的 .Rprofile 中。那么你永远不会忘记它。此外,随着时间的推移,您的 .Rprofile 会累积您的所有自定义设置。 当然由你决定,但 Q 不是“我怎样才能不忘记做 X”,而是“我怎样才能做 X”。 @zx8754:我每天在多个项目中在 R 和 Python/pandas 之间切换。两者都有自定义、包路径等。拥有一个通用的配置文件来存储它们确实让事情变得理智。跨项目。 @zx8754:当您在跨多种语言处理多个项目时,“我如何做 X”这个问题与“我如何才能不忘记做 X”合并,以可扩展、一致的方式,自动方式。我只是添加了更多解释。无论谁是开车投票的人。

以上是关于强制 R 不使用指数符号(例如 e+10)?的主要内容,如果未能解决你的问题,请参考以下文章

在对数轴刻度中设置指数符号 - Matlab

为啥求幂(例如 10^6)比 R 中的计算器符号(例如 1e6)花费的时间长 4 倍?

数学常识--数学符号常识

从科学记数法中提取指数

如何将 Double 转换为具有指数符号的字符串

使用递归和 mod 计算指数的算法