2013-12-09 79 views
1

對於我的json編碼器,我想打印一組數字,其小數位數爲n。兩種方法是:高性能數字格式

x <- c(1,2,pi) 
n <- 2 
format(x, digits = n, nsmall = n, trim = TRUE, drop0trailing = TRUE) 
formatC(x, digits = n, format = "f", drop0trailing = TRUE) 

然而drop0trailing參數似乎引入大(〜10倍)業績倒退:

x <- rnorm(1e6) 
system.time(format(x, digits = n, nsmall = n, trim = TRUE)) 
    user system elapsed 
    0.584 0.000 0.584 
system.time(format(x, digits = n, nsmall = n, trim = TRUE, drop0trailing = TRUE)) 
    user system elapsed 
    5.763 0.040 5.799 

有印數與n小數是更快的另一種方式?

回答

5

命令

as.character(round(x, n)) 
# [1] "1" "2" "3.14" 

要快很多。 options(scipen = k)控制是否跳轉到科學記數法。

另一種選擇是

sub("\\.0+$", "", sprintf(paste0("%.", n, "f"), x)) 
# [1] "1" "2" "3.14" 

此命令的優點是結果不是在科學記數法。

性能檢查:

f1 <- function() format(x, digits = n, nsmall = n, trim = TRUE, drop0trailing = TRUE) 
f2 <- function() formatC(x, digits = n, format = "f", drop0trailing = TRUE) 
f3 <- function() as.character(round(x, n)) 
f4 <- function() sub("\\.0+$", "", sprintf(paste0("%.", n, "f"), x)) 

library(microbenchmark) 
microbenchmark(f1(), f2(), f3(), f4()) 
# Unit: microseconds 
# expr  min  lq median  uq  max neval 
# f1() 288.594 294.6525 298.5165 302.5325 544.610 100 
# f2() 319.022 324.4970 327.0815 331.4695 600.179 100 
# f3() 9.799 12.4140 13.6315 13.9910 142.313 100 
# f4() 40.198 42.6590 45.9945 46.6180 342.098 100 
+0

我可以阻止它形成跳躍到科幻符號? 'as.character(round(0.0001,4))' – Jeroen

+0

@Jeroen查看我答案的更新。 –

+0

@Jeroen我把'sprintf'和'sub'結合在了一起。查看更新。 –

0

我不知道,如果這個工程(如果你想有三位整體):

as.numeric(formatC(x, flag="#", digits=3)) 

如果您的號碼是0和1之間的所有,然後指定as.numeric(formatC(x, flag="#", digits=(n+1)))給你答案。