在R中用相同的向量打印科学和标准符号

时间:2016-08-19 04:12:56

标签: r

我希望R打印出一个标准和科学符号混合的矢量。

为什么呢?它更容易阅读。

具体来说,我有一个介于0和1之间的极端分歧值的向量;一些数量级从10 ^ -1到10 ^ -16,我喜欢10 ^ -1或-2的那些以标准打印,而那些更大的打印用于科学。

目前我只能强迫R做1或其他。

E.g。

> rrr <- c(0.12, 0.01333, 0.0000000000000003856)
> rrr
[1] 1.200e-01 1.333e-02 3.856e-16

> options(scipen = 12)
> rrr
[1] 0.1199999999999999956 0.0133299999999999998 0.0000000000000003856

所以scipen似乎适用于整个向量,而不是每个元素。同样,改变例如options(digits = 2)只是将最小的数字四舍五入到0.00000000000000039

我希望看到的是

> rrr
[1] 0.12 0.013333 3.856e-16

思想?

谢谢,你们都是读这篇文章的传说!

[另外,我不理解scipen = 12时的非舍入行为,但这是另一个问题......]

2 个答案:

答案 0 :(得分:3)

这肯定是一个黑客攻击,并且启动不完整:“这个功能”很棒的方式是这个函数表现为大多数基于S3的函数,实际上是在“打印”数字对象时调用。

此外,它还远未完成。在这种情况下,它假定一个向量,并没有考虑控制台宽度,等间距等等。

但这是一个开始(“游戏”的一个例子),展示了一个“可能”如何处理如此的强迫症: - )

options(scipen2 = 3)
print.numeric <- function(x, ...) {
  scipen2 <- getOption("scipen2", default = 3)
  cat(c(ifelse(abs(log(x, 10L)) >= scipen2,
               format(x, digits = 5, scientific = TRUE),
               format(x, digits = 1, scientific = FALSE)),
        "\n"))
}

print(c(101, NA, pi / 100, pi / 10000, 1/100, pi * 10000))
#   101.0000 NA     0.0314 3.1416e-04     0.0100 3.1416e+04 

我不建议将其用于生产用途。我甚至不推荐它用于开发用途,除非你很乐意容易破损,格式化不好等等。也许它会引发一些想法和/或谈话。 (但除了讨论好奇心之外,它真的不适合。)

答案 1 :(得分:1)

steveb进行进一步评论:

rrr <- c(0.12, 0.01333, 0.0000000000000003856)
#the foom calculates the order of magnitude of the number. Division by 1000 set the
# number of digits to preserve - 3 more than the order of magnitude
foom <- function(x) {
  -round(log10(abs(x/1000)),0)
}
#round by foom and print as charecter
sapply(round(rrr,foom(rrr)), function(x) as.character(x))

#[1] "0.12"     "0.01333"  "3.86e-16"