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


R sprintf 使用 C 风格字符串格式化命令


R语言 sprintf 位于 base 包(package)。

说明

C 函数 sprintf 的包装器,返回包含文本和变量值的格式化组合的字符向量。

用法

sprintf(fmt, ...)
gettextf(fmt, ..., domain = NULL, trim = TRUE)

参数

fmt

格式字符串的字符向量,每个格式字符串最多 8192 字节。

...

要传递到 fmt 的值。仅支持逻辑向量、整数向量、实向量和字符向量,但会进行一些强制转换:请参阅“详细信息”部分。最多 100 个。

trim, domain

请参阅gettext

细节

sprintf是系统的包装器sprintfC 库函数。尝试检查传递的值的模式是否与提供的格式匹配,并且R的特殊值(NA,Inf,-InfNaN) 得到正确处理。

gettextf 是一个方便的函数,它提供 C 风格的字符串格式化以及格式字符串的可能翻译。

如果可能的话,参数(包括 fmt )将被循环利用整数次以达到最长的长度,然后并行完成格式化。允许零长度参数,并将给出零长度结果。即使未使用,也会评估所有参数,因此某些类型(例如 "symbol""language" ,请参阅 typeof )是不允许的。 fmt 未使用的参数会导致警告。 (格式 %.0s 可用于 “skip” 参数。)

以下内容摘自 Kernighan 和 Ritchie(请参阅引用):但是实际实现将遵循 C99 标准,并且细节(尤其是用户错误下的行为)可能取决于平台。对编号参数的引用来自 POSIX。

字符串 fmt 包含传递到输出字符串的普通字符,以及对通过 ... 提供的参数进行操作的转换规范。允许的转换规范以 % 开头,并以 aAdifeEgGosxX% 集合中的字母之一结尾。这些字母表示以下类型:

d , i , o , x , X

整数值,o 为八进制,xX 为十六进制(使用与 a-f 相同的大小写作为代码)。具有精确整数值的数字变量将被强制为整数。格式 di 也可用于逻辑变量,它们将转换为 01NA

f

双精度值,采用 “fixed point” 十进制表示法,格式为 "[-]mmm.ddd"。小数位数("d")由精度指定:默认为6;精度为 0 会抑制小数点。非有限值将转换为 NANaN 或(后面可能有一个符号) Inf

e , E

双精度值,采用 “exponential” 十进制表示法,格式为 [-]m.ddde[+-]xx[-]m.dddE[+-]xx

g , G

双精度值,如果指数小于 -4 或大于或等于精度,则采用 %e%E 格式,否则采用 %f 格式。 (此处的精度(默认为 6)指定有效位数,而在 %f, %e 中,它是小数点后的位数。)

a , A

双精度值,采用 [-]0xh.hhhp[+-]d 形式的二进制表示法。这是以十六进制乘以 2(十进制)幂表示的二进制分数。小数点后的十六进制位数由精度指定:默认值是足够的位数来准确表示内部二进制表示形式。非有限值将转换为 NANaN 或(后面可能有一个符号)Inf 。格式 %axp 和十六进制值使用小写:格式 %A 使用大写。

这应该在所有平台上都支持,因为它是 C99 的一个函数。格式不是唯一定义的:虽然可以使前导 h 始终为零或一,但并不总是这样做。大多数系统都会抑制尾随零,但也有一些系统不会。在一个编写良好的平台上,对于普通数字,小数点前会有一位前导加上(默认情况下)13 个十六进制数字,因此有 53 位。非规范化(又名‘subnormal’)数字的处理非常依赖于平台。

s

字符串。字符 NA 转换为 "NA"

%

文字%(在这种情况下,不允许使用下面给出的任何额外格式字符)。

as.character 的转换用于 s 的非字符参数,as.double 的转换用于 f, e, E, g, G 的非双精度参数。注意:长度是在转换之前确定的,因此如果内部强制会改变长度,请不要依赖内部强制。强制转换仅执行一次,因此如果 length(fmt) > 1 则所有元素都必须期望相同类型的参数。

此外,在初始 % 和终止转换字符之间可以按任意顺序存在:

m.n

由句点分隔的两个数字,表示字段宽度 ( m ) 和精度 ( n )。

-

对其字段中转换后的参数进行左调整。

+

始终打印带符号的数字:默认情况下,仅打印带符号的负数。

空间

如果第一个字符不是符号,请添加空格前缀。

0

对于数字,用前导零填充字段宽度。对于字符,此 zero-pads 在某些平台上会被忽略,而在其他平台上会被忽略。

#

为数字指定“alternate output”,其操作取决于类型:对于xX0x0X将在非零结果前面添加前缀。对于 eefgG ,输出始终有小数点;对于 gG ,尾随零不会被删除。

此外,在%之后可以立即从1$99$来引用编号的参数:这允许乱序引用参数,主要用于错误消息的翻译者。如果这样做,最好对所有格式进行编号:如果不是,则未编号的格式按顺序处理参数。请参阅示例。此表示法允许参数多次使用,在这种情况下,它们必须用作相同类型(整数、双精度或字符)。

字段宽度或精度(但不能同时)可以用星号 * 表示:在这种情况下,参数指定所需的数字。负字段宽度被视为'-' 标志,后跟正字段宽度。负精度被视为如同省略精度一样。参数应该是整数,但双精度参数将被强制为整数。

fmt 的元素以及单个 % 字母转换规范中包含的字符串的长度限制为 8192 个字节。

%s 转换的字段宽度和精度被解释为字节,而不是字符,如 C 标准中所述。

C 双打用于R数值向量有符号零,其中sprintf可能输出为-0,-0.000....

长度为最长输入的字符向量。如果 fmt 的任何元素或任何字符参数声明为 UTF-8,则结果的元素将采用 UTF-8 格式,并且编码声明为 UTF-8。否则它将采用当前语言环境的编码。

警告

格式字符串向下传递到操作系统sprintf函数,错误的格式可能会导致后者崩溃R过程 。R确实对格式进行健全性检查,但并非所有平台上所有可能的用户错误都经过测试,有些可能是终端错误。

此处未记录的输入行为是‘undefined’,这意味着它允许因平台而异。

例子

## be careful with the format: most things in R are floats
## only integer-valued reals get coerced to integer.

sprintf("%s is %f feet tall\n", "Sven", 7.1)      # OK
try(sprintf("%s is %i feet tall\n", "Sven", 7.1)) # not OK
    sprintf("%s is %i feet tall\n", "Sven", 7  )  # OK

## use a literal % :

sprintf("%.0f%% said yes (out of a sample of size %.0f)", 66.666, 3)

## various formats of pi :

sprintf("%f", pi)
sprintf("%.3f", pi)
sprintf("%1.0f", pi)
sprintf("%5.1f", pi)
sprintf("%05.1f", pi)
sprintf("%+f", pi)
sprintf("% f", pi)
sprintf("%-10f", pi) # left justified
sprintf("%e", pi)
sprintf("%E", pi)
sprintf("%g", pi)
sprintf("%g",   1e6 * pi) # -> exponential
sprintf("%.9g", 1e6 * pi) # -> "fixed"
sprintf("%G", 1e-6 * pi)

## no truncation:
sprintf("%1.f", 101)

## re-use one argument three times, show difference between %x and %X
xx <- sprintf("%1$d %1$x %1$X", 0:15)
xx <- matrix(xx, dimnames = list(rep("", 16), "%d%x%X"))
noquote(format(xx, justify = "right"))

## More sophisticated:

sprintf("min 10-char string '%10s'",
        c("a", "ABC", "and an even longer one"))

## Platform-dependent bad example from qdapTools 1.0.0:
## may pad with spaces or zeroes.
sprintf("%09s", month.name)

n <- 1:18
sprintf(paste0("e with %2d digits = %.", n, "g"), n, exp(1))

## Using arguments out of order
sprintf("second %2$1.0f, first %1$5.2f, third %3$1.0f", pi, 2, 3)

## Using asterisk for width or precision
sprintf("precision %.*f, width '%*.3f'", 3, pi, 8, pi)

## Asterisk and argument re-use, 'e' example reiterated:
sprintf("e with %1$2d digits = %2$.*1$g", n, exp(1))

## re-cycle arguments
sprintf("%s %d", "test", 1:3)

## binary output showing rounding/representation errors
x <- seq(0, 1.0, 0.1); y <- c(0,.1,.2,.3,.4,.5,.6,.7,.8,.9,1)
cbind(x, sprintf("%a", x), sprintf("%a", y))

作者

Original code by Jonathan Rougier.

参考

Kernighan, B. W. and Ritchie, D. M. (1988) The C Programming Language. Second edition, Prentice Hall. Describes the format options in table B-1 in the Appendix.

The C Standards, especially ISO/IEC 9899:1999 for ‘C99’. Links can be found at https://developer.r-project.org/Portability.html.

https://pubs.opengroup.org/onlinepubs/9699919799/functions/snprintf.html for POSIX extensions such as numbered arguments.

man sprintf on a Unix-alike system.

也可以看看

formatC 用于以类似方式格式化数字向量的方法。

paste 用于创建组合文本和值的向量的另一种方法。

gettext 用于文本自动翻译的机制。

相关用法


注:本文由纯净天空筛选整理自R-devel大神的英文原创作品 Use C-style String Formatting Commands。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。