我想知道10的权力是否和如何与在控制台中印刷科学符号有关。我已经搜索了R文档,但没有发现任何相关的东西,或者是我真正理解的。
首先,我的scipen和digits设置是
unlist(options("scipen", "digits"))
# scipen digits
# 0 7 现在,10的功率通常被打印到第4次,然后在第5次时打印开关到科学符号。
10^(1:4)
# [1] 10 100 1000 10000
10^(1:5)
# [1] 1e+01 1e+02 1e+03 1e+04 1e+05有趣的是,对于其他大于10的数字,这种情况不会发生。
11^(1:5)
# [1] 11 121 1331 14641 161051从下面看,5位数字似乎很重要。
100^(1:2)
# [1] 100 10000
100^(1:3)
# [1] 1e+02 1e+04 1e+06所以我的问题是:
为什么科学表示法在第4次和第5次之间激活为10,而不用于其他数字?数字5有意义吗?此外,为什么5而不是接近22的最大数字选项的数字呢?
发布于 2014-09-16 04:14:15
实际上,答案就在scipen在?options中的定义中,尽管如果不使用一些示例,很难理解它的含义:
整数。在决定用固定或指数符号打印数字值时要施加的惩罚。正值偏向固定符号,负值偏向科学表示法:固定表示法将是首选的,除非它比“枕”数字更宽。
要了解这意味着什么,请检查以下三对完全相同的数字。在前两种情况下,固定符号的字符宽度小于或等于科学符号的宽度,因此固定符号是首选的。
但是,在第三种情况下,固定表示法更宽(即“大于0位”),因为5个零比使用e+nn表示相同值的4个字符多。因此,在这种情况下,科学表示法是首选的。
1e+03
1000
# [1] 1000
1e+04
10000
# [1] 10000
1e+05
100000 ## <- wider
# [1] 1e+05接下来,检查一些以大量零结尾的数字,但是它的科学表示法需要使用.。对于这些数字,一旦有6个或更多的零(即超过一个.和e+nn字符占用的5个字符),就会使用科学符号。
1.1e+06
1100000
# [1] 1100000
1.1e+07
11000000 ## <- wider
# [1] 1.1e+07对于大多数其他数字来说,关于权衡的推理要复杂一些,因为对这些数字来说,options("scipen")和options("digits")的值都起作用,但总体观点完全相同。
要了解其中一些稍微令人惊讶的复杂情况,您可能需要将以下内容粘贴到您的控制台中(可能是在第一次尝试预测每个系列中将在哪里发生科学标记之后)。
100001
1000001
10000001
100000001
1000000001
10000000001
100000000001
1000000000001
111111
1111111
11111111
111111111
1111111111
11111111111
111111111111
1111111111111发布于 2014-09-16 04:07:38
我搞不懂你的问题到底是什么;或者,更具体地说,你会如何用这个问题的答案来改变/控制R的行为,你想用某种方式格式化数字吗?有更好的方法来做到这一点。
当您键入类似的值时,结果将通过要“很好”格式化到控制台的print()命令之一隐式运行。每当屏幕上的东西看起来很“好看”时,这样做的代码通常都很难看。在这里,大部分代码由formatReal函数和助手科学函数处理。后者跟踪数字的下列信息
/* for a number x , determine
* sgn = 1_{x < 0} {0/1}
* kpower = Exponent of 10;
* nsig = min(R_print.digits, #{significant digits of alpha})
* roundingwidens = 1 if rounding causes x to increase in width, 0 otherwise
*
* where |x| = alpha * 10^kpower and 1 <= alpha < 10
*/然后,前一个函数使用这些信息,通过平衡小数位的左边和右边的值,试图使“好看”的数字看起来很好看。它是许多东西的组合,比如数字的数量级和有效数字的数量,以及scipen选项的环境影响等等。
print()只是为了让事情看起来“美好”。什么是好的,取决于向量中的所有值。在该代码中,您会发现很少有硬剪切;它非常具有适应性。在一般情况下,没有一种简单的方法可以简明地描述它所做的一切(这听起来像是你所要求的)。
唯一可以确定的是,如果您需要以某种方式格式化您的数字,可以使用像sprintf()或formatC()这样的函数来进行精确的控制。
当然,这种行为依赖于class(),我已经指出了formatReal的特点,因为这是最棘手的事情发生的地方。但是当您使用整数时,请注意不同之处。
c(10, 100, 1000, 10000, 100000)
# [1] 1e+01 1e+02 1e+03 1e+04 1e+05
c(10L, 100L, 1000L, 10000L, 100000L)
# [1] 10 100 1000 10000 100000https://stackoverflow.com/questions/25859609
复制相似问题