当前位置: 首页>>代码示例 >>用法及示例精选 >>正文


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。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。