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。非經特殊聲明,原始代碼版權歸原作者所有,本譯文未經允許或授權,請勿轉載或複製。