當前位置: 首頁>>代碼示例 >>用法及示例精選 >>正文


R formatC 使用 C 樣式格式進行格式化


R語言 formatC 位於 base 包(package)。

說明

formatC() 使用 C 樣式格式規範單獨靈活地格式化數字。

prettyNum() 用於 “prettifying” (可能已格式化)數字,也在 format.default 中。

.format.zeros(x)prettyNum() 的輔助函數,它重新格式化格式化數字向量 x 中的零。

用法

formatC(x, digits = NULL, width = NULL,
        format = NULL, flag = "", mode = NULL,
        big.mark = "", big.interval = 3L,
        small.mark = "", small.interval = 5L,
        decimal.mark = getOption("OutDec"),
        preserve.width = "individual",
        zero.print = NULL, replace.zero = TRUE,
        drop0trailing = FALSE)

prettyNum(x, big.mark = "",   big.interval = 3L,
          small.mark  = "", small.interval = 5L,
          decimal.mark = getOption("OutDec"), input.d.mark = decimal.mark,
          preserve.width = c("common", "individual", "none"),
          zero.print = NULL, replace.zero = FALSE,
          drop0trailing = FALSE, is.cmplx = NA,
          ...)

.format.zeros(x, zero.print, nx = suppressWarnings(as.numeric(x)),
              replace = FALSE, warn.non.fitting = TRUE)

參數

x

原子數字或字符對象,可能僅適用於 complex prettyNum() ,通常是實數向量。任何類都會被丟棄,並帶有警告。

digits

小數點後所需的位數 ( format = "f" ) 或有效數字 ( format = "g"= "e"= "fg" )。

默認值:2 表示整數,4 表示實數。如果小於 0,則使用 C 默認的 6 位數字。如果指定超過 50,則使用 50 時會出現警告,除非 format = "f" 將其限製為通常為 324。(準確的數字不超過 15-21 位,具體取決於所使用的操作係統和編譯器。此限製隻是針對底層 C 運行時中的段錯誤的預防措施。)

width

總字段寬度;如果 digitswidth 均未指定,則 width 默認為 1,否則為 digits + 1width = 0 將使用 width = digitswidth < 0 表示左對齊該字段中的數字(相當於 flag = "-" )。如有必要,結果將包含比 width 更多的字符。對於字符數據,這以字符(不是字節或顯示寬度)來解釋。

format

等於 "d" (對於整數)、 "f""e""E""g""G""fg" (對於實數)或 "s" (對於字符串)。對於整數,默認值為 "d";對於實數,默認值為 "g"

"f" 以通常的 xxx.xxx 格式給出數字; "e""E"給出n.ddde+nnn.dddE+nn(科學格式); "g""G" 僅在節省空間並刪除尾隨零和小數點的情況下才將 x[i] 轉換為科學格式 - 除非 flag 包含 "#",後者為 "g", "G" 格式保留尾隨零。

"fg" (我們自己的混合格式)使用固定格式 "f" ,但 digits 作為有效數字的最小數量。這可能會導致相當長的結果字符串,請參見下麵的示例。請注意,與 signif 不同,它會打印比 digits 更有效的數字。除非 flag 包含 "#" ,否則在此格式中會刪除尾隨零。

flag

對於 formatC ,給出格式修飾符的字符串,如 Kernighan 和 Ritchie(1988 年,第 243 頁)或 C+99 標準中所示。

"0"

填充前導零;

"-"

進行左調整,

"+"

確保在所有情況下都有符號,即 "+" 表示正數,

" "

如果第一個字符不是符號,則將使用空格字符" "

"#"

指定“替代輸出形式”,具體取決於 format

"'"

在某些platform-locale組合上,激活“千位分組”進行十進製轉換,

"I"

在某些版本的‘glibc' 允許整數轉換以使用區域設置的替代輸出數字(如果有)。

這些標誌可以有多個,順序任意。其他字符過去沒有效果character格式化,但發出錯誤信號R3.4.0。

mode

"double" (或 "real" )、"integer""character" 。默認值:根據 x 的存儲模式確定。

big.mark

特點;如果不為空,則用作小數點之前的每個 big.interval 小數點之間的標記(因此 big )。

big.interval

參見上麵的big.mark;默認為 3。

small.mark

特點;如果不為空,則用作小數點後每個 small.interval 小數之間的標記(因此 small )。

small.interval

參見上麵的small.mark;默認為 5。

decimal.mark

用於指示數字小數點的字符。

input.d.mark

如果 xcharacter ,則已知已在 x 中用作數字小數點的字符。

preserve.width

字符串,指定在添加標記( big.marksmall.mark )的情況下是否應盡可能保留字符串寬度。默認值 "common" 對應於類似 format 的行為,而 "individual"formatC() 中的默認值。值可以縮寫。

zero.print

邏輯、字符串或 NULL 指定是否以及如何對零進行特殊格式化。對於漂亮打印 ‘sparse’ 對象很有用。

replace.zero , replace

邏輯性;如果 zero.print 是字符串,則指示 x 中的精確零條目是否應簡單地替換為 zero.print 。否則,根據各個字符串的寬度,(格式化的)零部分被zero.print替換,然後用" "填充到右側是適用的。在這種情況下( false replace[.zero] ),如果 zero.print 字符串不適合,則會生成警告(如果 warn.non.fitting 為 true)。

這是通過 prettyNum() 實現的,在本例中調用 .format.zeros(*, replace=replace.zero) 三次,請參閱“詳細信息”。

warn.non.fitting

邏輯性;如果為 true,則 replace[.zero] 為 false,並且 zero.print 字符串不適合,則發出 warning 信號。

drop0trailing

邏輯,指示是否應刪除尾隨零,即小數點後的"0";還會以指數格式刪除 "e+00"。這隻是傳遞給prettyNum(),請參閱“詳細信息”。

is.cmplx

可選邏輯,當 x"character" 時使用,以指示它是否源自 complex 向量。默認情況下 ( NA ),x 被檢查為“看起來像”複雜。

...

參數傳遞給 format

nx

x 長度相同的數值向量,通常是字符向量 x 為其預格式的數字。

細節

對於數字, formatC() 在需要時調用 prettyNum() ,而 prettyNum() 本身又調用 .format.zeros(*, replace=replace.zero) 。 (“when needed”:當 zero.print 不是 NULL 時,drop0trailing 為 true,或者 big.marksmall.markdecimal.mark 之一不是默認值。)

如果您設置 format ,它將覆蓋 mode 的設置,因此 formatC(123.45, mode = "double", format = "d") 給出 123

科學格式的呈現取決於平台:某些係統使用 n.ddde+nnnn.dddenn 而不是 n.ddde+nn

formatC 不一定對齊小數點上的數字,因此 formatC(c(6.11, 13.1), digits = 2, format = "fg") 給出 c("6.1", " 13") 。如果您想要多個數字的通用格式,請使用 format

prettyNum 是美化 x 的實用函數。這裏的 x 可以很複雜(或 format(<complex>) )。如果 x 不是字符,則 format(x[i], ...) 應用於每個元素,然後如果所有其他參數均采用默認值,則保持不變。當 xcharacter 向量,而不是由像 format(<number>) 等以句點作為小數標記的向量產生時,請使用 prettyNum(x)input.d.mark 參數。

由於 gsub 用於插入 big.marksmall.mark ,因此特殊字符需要轉義。特別是,要插入單個反斜杠,請使用 "\\\\"

C 雙打用於R數值向量有符號零,其中formatC可能輸出為-0,-0.000....

如果 big.markdecimal.mark 相同,則會出現警告:這會讓讀取輸出的人感到困惑。

在當前語言環境的編碼中,與 x 具有相同大小和屬性的字符對象(在丟棄任何類之後)。

format 不同,每個數字都是單獨格式化的。循環 x 的每個元素,調用 C 函數 sprintf(...) 進行數字輸入(在 C 函數 str_signif 內部)。

formatC :對於字符 x ,使用空格進行簡單(左或右)填充。

注意

默認為decimal.markformatC()被改變於R3.2.0:在以下範圍內使用print包中可能與早期版本一起使用的方法:usedecimal.mark = getOption("OutDec")明確地。

例子

xx <- pi * 10^(-5:4)
cbind(format(xx, digits = 4), formatC(xx))
cbind(formatC(xx, width = 9, flag = "-"))
cbind(formatC(xx, digits = 5, width = 8, format = "f", flag = "0"))
cbind(format(xx, digits = 4), formatC(xx, digits = 4, format = "fg"))

f <- (-2:4); f <- f*16^f
# Default ("g") format:
formatC(pi*f)
# Fixed ("f") format, more than one flag ('width' partly "enlarged"):
cbind(formatC(pi*f, digits = 3, width=9, format = "f", flag = "0+"))

formatC(    c("a", "Abc", "no way"), width = -7)  # <=> flag = "-"
formatC(c((-1:1)/0,c(1,100)*pi), width = 8, digits = 1)

## note that some of the results here depend on the implementation
## of long-double arithmetic, which is platform-specific.
xx <- c(1e-12,-3.98765e-10,1.45645e-69,1e-70,pi*1e37,3.44e4)
##       1        2             3        4      5       6
formatC(xx)
formatC(xx, format = "fg")       # special "fixed" format.
formatC(xx[1:4], format = "f", digits = 75) #>> even longer strings

formatC(c(3.24, 2.3e-6), format = "f", digits = 11)
formatC(c(3.24, 2.3e-6), format = "f", digits = 11, drop0trailing = TRUE)

r <- c("76491283764.97430", "29.12345678901", "-7.1234", "-100.1","1123")
## American:
prettyNum(r, big.mark = ",")
## Some Europeans:
prettyNum(r, big.mark = "'", decimal.mark = ",")

(dd <- sapply(1:10, function(i) paste((9:0)[1:i], collapse = "")))
prettyNum(dd, big.mark = "'")

## examples of 'small.mark'
pN <- stats::pnorm(1:7, lower.tail = FALSE)
cbind(format (pN, small.mark = " ", digits = 15))
cbind(formatC(pN, small.mark = " ", digits = 17, format = "f"))

cbind(ff <- format(1.2345 + 10^(0:5), width = 11, big.mark = "'"))
## all with same width (one more than the specified minimum)

## individual formatting to common width:
fc <- formatC(1.234 + 10^(0:8), format = "fg", width = 11, big.mark = "'")
cbind(fc)
## Powers of two, stored exactly, formatted individually:
pow.2 <- formatC(2^-(1:32), digits = 24, width = 1, format = "fg")
## nicely printed (the last line showing 5^32 exactly):
noquote(cbind(pow.2))

## complex numbers:
r <- 10.0000001; rv <- (r/10)^(1:10)
(zv <- (rv + 1i*rv))
op <- options(digits = 7) ## (system default)
(pnv <- prettyNum(zv))
stopifnot(pnv == "1+1i", pnv == format(zv),
          pnv == prettyNum(zv, drop0trailing = TRUE))
## more digits change the picture:
options(digits = 8)
head(fv <- format(zv), 3)
prettyNum(fv)
prettyNum(fv, drop0trailing = TRUE) # a bit nicer
options(op)

## The  '  flag :
doLC <- FALSE # <= R warns, so change to TRUE manually if you want see the effect
if(doLC) {
  oldLC <- Sys.getlocale("LC_NUMERIC")
           Sys.setlocale("LC_NUMERIC", "de_CH.UTF-8")
}
formatC(1.234 + 10^(0:4), format = "fg", width = 11, flag = "'")
## -->  .....  "      1'001" "     10'001"   on supported platforms
if(doLC) ## revert, typically to  "C"  :
  Sys.setlocale("LC_NUMERIC", oldLC)

作者

formatC was originally written by Bill Dunlap for S-PLUS, later much improved by Martin Maechler.

It was first adapted for R by Friedrich Leisch and since much improved by the R Core team.

參考

Kernighan, B. W. and Ritchie, D. M. (1988) The C Programming Language. Second edition. Prentice Hall.

也可以看看

format

sprintf 用於更通用的 C-like 格式。

相關用法


注:本文由純淨天空篩選整理自R-devel大神的英文原創作品 Formatting Using C-style Formats。非經特殊聲明,原始代碼版權歸原作者所有,本譯文未經允許或授權,請勿轉載或複製。