sprintf
位于 base
包(package)。 说明
C 函数 sprintf
的包装器,返回包含文本和变量值的格式化组合的字符向量。
用法
sprintf(fmt, ...)
gettextf(fmt, ..., domain = NULL, trim = TRUE)
参数
fmt |
格式字符串的字符向量,每个格式字符串最多 8192 字节。 |
... |
要传递到 |
trim, domain |
请参阅 |
细节
sprintf
是系统的包装器sprintf
C 库函数。尝试检查传递的值的模式是否与提供的格式匹配,并且R的特殊值(NA
,Inf
,-Inf
和NaN
) 得到正确处理。
gettextf
是一个方便的函数,它提供 C 风格的字符串格式化以及格式字符串的可能翻译。
如果可能的话,参数(包括 fmt
)将被循环利用整数次以达到最长的长度,然后并行完成格式化。允许零长度参数,并将给出零长度结果。即使未使用,也会评估所有参数,因此某些类型(例如 "symbol"
或 "language"
,请参阅 typeof
)是不允许的。 fmt
未使用的参数会导致警告。 (格式 %.0s
可用于 “skip” 参数。)
以下内容摘自 Kernighan 和 Ritchie(请参阅引用):但是实际实现将遵循 C99 标准,并且细节(尤其是用户错误下的行为)可能取决于平台。对编号参数的引用来自 POSIX。
字符串 fmt
包含传递到输出字符串的普通字符,以及对通过 ...
提供的参数进行操作的转换规范。允许的转换规范以 %
开头,并以 aAdifeEgGosxX%
集合中的字母之一结尾。这些字母表示以下类型:
d
,i
,o
,x
,X
-
整数值,
o
为八进制,x
和X
为十六进制(使用与a-f
相同的大小写作为代码)。具有精确整数值的数字变量将被强制为整数。格式d
和i
也可用于逻辑变量,它们将转换为0
、1
或NA
。 f
-
双精度值,采用 “fixed point” 十进制表示法,格式为 "[-]mmm.ddd"。小数位数("d")由精度指定:默认为6;精度为 0 会抑制小数点。非有限值将转换为
NA
、NaN
或(后面可能有一个符号)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(十进制)幂表示的二进制分数。小数点后的十六进制位数由精度指定:默认值是足够的位数来准确表示内部二进制表示形式。非有限值将转换为NA
、NaN
或(后面可能有一个符号)Inf
。格式%a
对x
、p
和十六进制值使用小写:格式%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”,其操作取决于类型:对于
x
或X
,0x
或0X
将在非零结果前面添加前缀。对于e
、e
、f
、g
和G
,输出始终有小数点;对于g
和G
,尾随零不会被删除。
此外,在%
之后可以立即从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 split 分组并重新集合
- R strsplit 分割字符向量的元素
- R seq.Date 生成规则的日期序列
- R search 给出 R 对象的搜索路径
- R solve 求解方程组
- R scan 读取数据值
- R stop 停止函数执行
- R sign 标志函数
- R svd 矩阵的奇异值分解
- R strtoi 将字符串转换为整数
- R source 从文件、连接或表达式中读取 R 代码
- R sQuote 引用文字
- R switch 选择替代方案列表之一
- R substitute 替换和引用表达式
- R strrep 重复字符向量的元素
- R slice.index 数组中的切片索引
- R sort 对向量进行排序或排序
- R standardGeneric 形式化方法系统 – 调度 S4 方法
- R sequence 创建序列向量
- R startsWith 字符串是否以另一个字符串开头或结尾?
- R system.file 查找 R 系统文件的名称
- R sample 随机样本和排列
- R strwrap 将字符串换行以设置段落格式
- R seek 重新定位连接的函数
- R stopifnot 确保 R 表达式的真实性
注:本文由纯净天空筛选整理自R-devel大神的英文原创作品 Use C-style String Formatting Commands。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。