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


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