请考虑以下脚本:
list_of_numbers <- as.numeric()
for(i in 1001999498:1002000501){
list_of_numbers <- c(list_of_numbers, i)
}
write(list_of_numbers, file = "./list_of_numbers", ncolumns = 1)
生成的文件如下所示:
[user@pc ~]$ cat list_of_numbers
1001999498
1001999499
1.002e+09
...
1.002e+09
1.002e+09
1.002e+09
1002000501
我发现了R不能一致地打印数字格式的更多范围。
现在我有以下问题:
这是一个错误还是有此行为的实际原因? 为什么只是在某些范围内,为什么不是每个高于 x 的数字?
我知道我怎么能像这样解决这个问题:
options(scipen = 1000)
但是,还有比设置全局选项更优雅的方法吗?无需将其转换为数据帧并更改格式。
这不是一个错误,R选择最短的表示形式。
更准确地说,在?options
中可以读到:
除非超过
scipen
,否则首选固定表示法 数字更宽。
因此,当scipen
为 0(默认值)时,首选最短的表示法。
请注意,您可以使用format(x, scientific = TRUE)
获得数字x
的科学记数法。
在您的情况下:
1001999499
的长度为 10 个字符,而其科学记数法1.001999e+09
更长(12 个字符),因此保留十进制表示法。1001999500
:科学记数法是1.002e+09
,更短。
......- ...............(科学记数法等于
1.002e+09
,因此更短) 1002000501
:1.002001e+09
更长。
您可能会问:为什么1001999500
的格式为1.002e+09
而不是1.0019995e+09
?这仅仅是因为还有一个控制有效位数的选项。它名为digits
,默认值为 7。由于1.0019995
有 8 位有效数字,因此四舍五入为1.002
。
确保在不更改全局选项的情况下保留十进制表示法的最简单方法可能是使用format
:
write(format(list_of_numbers, scientific = FALSE, trim = TRUE),
file = "./list_of_numbers")
旁注:你不需要循环来生成你的list_of_numbers
(顺便说一下,它不是一个列表,而是一个向量)。只需使用:
list_of_numbers <- as.numeric(1001999498:1002000501)