1

对于具有紧凑空间限制的图形注释,我想以最小化每个数字的表示字符串长度的方式格式化数字。例如,10 的幂应该这样格式化:

  • 1e-4
  • 1e-3
  • 0.01
  • 0.1
  • 1
  • 10
  • 100
  • 1e3
  • 1e4

as.character似乎几乎做到了这一点,但不幸的是,它在个位数指数中放置了一个冗余的前导零,并在正指数之前插入了一个冗余的“+”。

> as.character(10^(-5:5))
 [1] "1e-05" "1e-04" "0.001" "0.01"  "0.1"   "1"     "10"    "100"   "1000"  "10000" "1e+05"

因此,例如,我们得到的不是 1e5,而是 1e+05,它的长度几乎是两倍。

4

1 回答 1

2

如何使用 aregex删除不需要的字符...

gsub( "\\+|(?<=\\+|\\-)0" , "" , 10^(-5:5) , perl = TRUE )
#[1] "1e-5"  "1e-4"  "0.001" "0.01"  "0.1"   "1"     "10"    "100"   "1000" 
#[10] "10000" "1e5"
  • \\+删除+
  • (?<=...)0是一个零宽度的后视断言,0只要它前面有 in 中的任何内容,它就会删除...,在这种情况下\\+|\\-,要么是+要么-

|分隔符链接表达式。在replaces""的第二个参数中gsub没有匹配。

编辑:基于讨论中提出的想法,这是一个现成的解决方案:

formatBrief <- function(x){
    options(scipen=-5)
    sci <- gsub( "(?<=e)\\+?0*|(?<=e-)0*" , "" , x , perl=TRUE)
    options(scipen=5)
    fp <- as.character(x)
    options(scipen=0)
    return (ifelse(nchar(sci)<nchar(fp),sci,fp))
}

> formatBrief(10^(-5:5))
 [1] "1e-5" "1e-4" "1e-3" "0.01" "0.1"  "1"    "10"   "100"  "1e3"  "1e4"  "1e5" 
于 2013-10-11T11:28:02.623 回答