我希望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
时的非舍入行为,但这是另一个问题......]
答案 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"