Rev 38402 | Blame | Compare with Previous | Last modification | View Log | Download | RSS feed
\name{sprintf}\alias{sprintf}\alias{gettextf}\title{Use C-style String Formatting Commands}\description{A wrapper for the C function \code{sprintf}, that returns a charactervector containing a formatted combination of text and variable values.}\usage{sprintf(fmt, \dots)gettextf(fmt, \dots, domain = NULL)}\arguments{\item{fmt}{a format string.}\item{\dots}{values to be passed into \code{fmt}. Only logical,integer, real and character vectors are supported, but some coercionwill be done: see the Details section.}\item{domain}{see \code{\link{gettext}}.}}\details{\code{sprintf} is a wrapper for the system \code{sprintf} C-libraryfunction. Attempts are made to check that the mode of the valuespassed match the format supplied, and \R's special values (\code{NA},\code{Inf}, \code{-Inf} and \code{NaN}) are handled correctly.\code{gettextf} is a convenience function which provides C-stylestring formatting with possible translation of the format string.The arguments (including \code{fmt}) are recycled if possible a wholenumber of times to the length of the longest, and then the formattingis done in parallel.The following is abstracted from Kernighan and Ritchie(see References). The string \code{fmt} contains normal characters,which are passed through to the output string, and also specialcharacters that operate on the arguments provided through\code{\dots}. Special characters start with a \code{\%} and end withone of the letters in the set \code{difeEgGsxX\%}. These lettersdenote the following types:\describe{\item{\code{d, i, x, X}}{Integer value, \code{x} and \code{X}being hexadecimal (using the same case for \code{a-f} as the code).Numeric variables with exactly integer values will be coerced to integer.}\item{\code{f}}{Double precision value, in decimal notation of theform "[-]mmm.ddd". The number of decimal places is specified bythe precision: the default is 6; a precision of 0 suppresses thedecimal point.}\item{\code{e, E}}{Double precision value, in decimal notation of theform \code{[-]m.ddde[+-]xx} or \code{[-]m.dddE[+-]xx}.}\item{\code{g, G}}{Double precision value, in \code{\%e} or\code{\%E} format if the exponent is less than -4 or greater than orequal to the precision, and \code{\%f} format otherwise.}\item{\code{s}}{Character string.}\item{\code{\%}}{Literal \code{\%} (none of the formattingcharacters given below are permitted in this case).}}\code{\link{as.character}} is used for non-character arguments with\code{s} and \code{\link{as.double}} for non-double arguments with\code{f, e, E, g, G}. NB: the length is determined before conversion,so do not rely on the internal coercion if this would change thelength.In addition, between the initial \code{\%} and the terminatingconversion character there may be, in any order:\describe{\item{\code{m.n}}{Two numbers separated by a period, denoting thefield width (\code{m}) and the precision (\code{n})}\item{\code{-}}{Left adjustment of converted argument in its field}\item{\code{+}}{Always print number with sign}\item{a space}{Prefix a space if the first number is not a sign}\item{\code{0}}{For numbers, pad to the field width with leading zeros}}Further, immediately after \code{\%} may come \code{1$} to \code{99$}to refer to the numbered argument: this allows arguments to bereferenced out of order and is mainly intended for translators oferror messages. If this is done it is best if all formats arenumbered: if not the unnumbered ones process the arguments in order.See the examples.A field width or precision (but not both) may be indicated by anasterisk \code{*}. In this case an argument specifies the desirednumber. A negative field width is taken as a '-' flag followed by apositive field width. A negative precision is taken as if theprecision were omitted. The \code{*1$} to \code{*99$} notation forarguments referenced out of order is also supported.The result has a length limit, probably 8192 bytes, and attemptsto exceed this may result in an error, or truncation with a warning.}\value{A character vector of length that of the longest input.Character \code{NA}s are converted to \code{"NA"}.}\references{Kernighan, B. W. and Ritchie, D. M. (1988)\emph{The C Programming Language.} Second edition, Prentice Hall.describes the format options in table B-1 in the Appendix.}\author{Original code by Jonathan Rougier, \email{J.C.Rougier@durham.ac.uk}.}\seealso{\code{\link{formatC}} for a way of formatting vectors of numbers in asimilar fashion.\code{\link{paste}} for another way of creating a vector combiningtext and values.\code{\link{gettext}} for the mechanisms for the automated translationof text.}\examples{% Escape all the '%' here !## 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) # OKtry(sprintf("\%s is \%i feet tall\n", "Sven", 7.1)) # not OKtry(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 justifiedsprintf("\%e", pi)sprintf("\%E", pi)sprintf("\%g", pi)sprintf("\%g", 1e6 * pi) # -> exponentialsprintf("\%.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 \%Xxx <- 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"))n <- 1:18sprintf(paste("e with \%2d digits = \%.",n,"g",sep=""), n, exp(1))## Using arguments out of ordersprintf("second \%2$1.0f, first \%1$5.2f, third \%3$1.0f", pi, 2, 3)## Using asterisk for width or precisionsprintf("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 argumentssprintf("\%s \%d", "test", 1:3)}\keyword{print}\keyword{character}