对于具有严格空间约束的图形注释,我想以最小化每个数字的表示字符串长度的方式格式化数字。例如,10的幂应格式如下:
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,这几乎是双倍的长度。
答案 0 :(得分:2)
如何使用regex
删除不需要的字符......
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
中的任何内容出现...
,就会删除\\+|\\-
,+
-
或|
""
分隔符链接表达式。 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"
将替换为空的匹配。
编辑:基于讨论中提出的想法,这是一个现成的解决方案:
{{1}}