我正在编写一个自定义print.xx
函数,以显示一组非常表格的数据。
列宽为11个字符,所以我这样做:
> format(1234.567,width=11,digits=7)
[1] " 1234.567"
> format(1234.56789,width=11,digits=7)
[1] " 1234.568"
到目前为止一切顺利。当我有一个非常大/小的数字并且科学记数出现时,问题出现了:
> format(1234.56789e10,width=11,digits=7)
[1] "1.234568e+13"
> format(1234.56789e-10,width=11,digits=7)
[1] "1.234568e-07"
它应该使用科学记数法,好吧,但我需要它坚持11个字符的宽度。我查找了scientific
和scipen
参数,但仍然超出了11个字符的限制。一个选项可能是检查是否生成科学记数法,如果是,则减少digits
参数,但看起来很俗气。
我怎么能强迫它给我一个固定长度的字符串,无论数字是否是科学记数法?
答案 0 :(得分:6)
我认为你必须适当地计算数字..也许这样的事情会起作用:
n <- 1234.567e2
prettyNum(n, digits=7-(nchar(n)-11), width=11, format="fg")
# [1] " 123456.7"
n <- 1234.567e9
prettyNum(n, digits=7-(nchar(n)-11), width=11, format="fg")
# [1] "1.23457e+12"
n <- 1234.567e100
prettyNum(n, digits=7-(nchar(n)-11), width=11, format="fg")
# [1] "1.2346e+103"
或等同于format
:
format(n, digits=7-(nchar(n)-11), width=11)
答案 1 :(得分:4)
就我而言,我用过:
的sprintf( “%11.5e”,123456789e10)
[1]“1.23457e + 18”
你只需要知道你想要多少个字符,并在width.decimal之间取得正确的平衡,即%11.5e
答案 2 :(得分:0)
> sprintf("%0.6g", 1234.56789e-10)
[1] "1.23457e-07"
> sprintf("%0.6g", 1234.56789e10)
[1] "1.23457e+13"