强制 R 不使用指数表示法(例如 e+10)?

290

我能否强制 R 使用普通数字而不是类似于 e+10 的记数法?我的代码如下:

1.810032e+09
# and 
4

在同一个向量中并且想要查看:

1810032000
# and
4

我正在为一款老式程序创建输出,并且必须使用cat来编写文本文件。目前为止这很好用,但是我无法在那里使用 e+10 表示法。


1
相关链接:https://dev59.com/6W865IYBdhLWcg3wHKzu - Richie Cotton
4个回答

279

这是一个有些模糊的领域。你需要记住,R始终会调用打印方法,并且这些打印方法会监听一些选项,包括“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)


1
谢谢。scipen似乎是我正在寻找的选项。可怕的惩罚解释让我望而却步。但是你的例子解释得很好。sprintf,嗯?你是在提到我一周前使用sprintf时遇到的问题吗? :) - Matt Bannert
5
在Rstudio中,如果你导入一个数据集并执行train_sample_10k = format(train_sample_10k, scientific=FALSE)后重新加载,这将会改变科学计数法的显示。 - mixdev
我怎样才能在完成这个操作后将一切恢复正常? - ABIM
8
@CSA: options("scipen"=0, "digits"=7)(这些是默认值)。意思是设置R语言的参数选项,将科学计数法关闭,保留小数点后七位。 - Scarabee
你应该将实现结果 options("scipen"=100, "digits"=4) 的代码移到顶部,而没有实现结果的代码则放在下面,并附上适当的注释。这样做可以避免让那些寻求快速解决方案的人感到困惑(因为谷歌搜索结果会显示第一个)。 - xbsd

208

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

options(scipen = 999)

5
此外,您可以将此放入您的 .Rprofile 文件,这样它就会自动默认执行。 - smci
如果您只想在函数内部执行此操作,则可以在函数代码中使用 withr::local_options(list(scipen = 999)) - Patrick

138

我最喜欢的答案:

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

这样做可以得到你想要的结果,而不必在R设置中瞎搞。

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


2
嗯,这很奇怪,对我不起作用。我没有收到错误信息,它仍然打印科学计数法。 - Ovi
1
不确定哪里出了问题。我在非常旧的(3.1.0)和新的(3.4.3)R版本中都进行了检查,它在两个版本中都可以正常工作。很可能是其他某个设置正在优先考虑,或者您发现了R中特定版本或边缘情况的错误。您是否可能将科学计数法的字符串输入而不是数字对象?这可以解释它。 - Danny
16
值得注意的是,这将创建一个字符而不是数字。 - cengel
4
如果向量中的数字长度不同,请确保使用justified =“none”,否则将填充空格使它们具有相同的长度。 - Lauren Fitch
1
format(1e6, scientific=FALSE) 返回 "1000000",而 as.character(1e6) 返回 "1e+06",因此这两种方法之间存在差异。 - mickey
显示剩余2条评论

19

options(scipen = 999) 放入你的.Rprofile文件中,以便默认情况下自动执行。(不要依赖手动执行。)

(这与其他答案所说的不同之处在于什么?)

  1. 在日常或每月使用多个项目、多种语言时,这可以保持事情清晰明了。记住输入适用于每个项目的设置容易出错且不具有可扩展性。您可以拥有全局 ~/.Rprofile 或项目特定的 .Rprofile 文件。或者两者都有,后者会覆盖前者。
  2. 将所有配置存储在项目范围或全局 .Rprofile 中会自动执行它。这对于例如默认包加载、data.table 配置、环境等非常有用。同样,该配置可以达到一页设置,您几乎没有机会记住这些设置、其语法和输入方式。

为什么答案完全一样?https://dev59.com/CGox5IYBdhLWcg3wJxL4#27318351 除了Rprofile部分,也许最好编辑GingerJack的答案? - zx8754
@zx8754:这并不是完全相同的答案:关键点在于将这些内容移动到您的.Rprofile文件中。然后,您就永远不会忘记它了。此外,随着时间的推移,您的.Rprofile会积累所有自定义内容。 - smci
1
当然由你决定,但问题不是“我如何才能不忘记做 X”,而是“我如何去做 X”。 - zx8754
@zx8754: 我每天在多个项目中使用 R 和 Python/pandas 进行编程。两者都有自定义设置、包路径等。将它们存储在一个通用的配置文件中确实可以保持一致性,跨越不同的项目。 - smci
抱歉,我并不质疑将东西放在Rprofile中的有用性。无论如何,你可以按照自己的意愿去做,对我来说,你的答案看起来和GingerJack的一样。也许我错了。 - zx8754
1
@zx8754:当你在多个项目中使用多种语言时,“如何做X”这个问题就会与“如何不忘记做X”这个问题合并在一起,以可扩展、一致和自动化的方式。我刚刚添加了更多的解释,针对那些匆匆点踩的人。 - smci

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