Human-Friendly Text from Unknown Strings

Simple functions for joining strings. Construct human-friendly messages whose elements aren't known in advance, like in stop, warning, or message, from clean code.

Build Status

Each function in concatenate returns a comma-separated string. (A length-one character vector.) They can be used to construct human-friendly messages whose elements aren't known in advance, like calls to message, warning or stop, from clean code.


The workhorse function in concatenate is cc.

cc("one fish", "two fish")

Its wrappers cc_or and cc_and insert "or" and "and" between the last two elements of the input.

cc_and("this", "that", "the other")
#> [1] "this, that and the other"
cc_or("one way", "another")
#> [1] "one way or another"

cn and its derivatives combine these functions with sprintf-like substitution and the grammatical number awareness of ngettext.

x <- unique(iris$Species)
cn_and(x, "a single species: %c", "%n unique species: %c")
#> [1] "3 unique species: setosa, versicolor and virginica"

There are row-wise data.frame methods for the cn functions.

singular <- "%n row: %c"
plural <- "%n rows whose values are %c"
cn(chickwts[1, ], singular, plural)
#> [1] "1 row: 179, horsebean"
cn_and(chickwts[1:3, 1, drop = FALSE], singular, plural)
#> [1] "3 rows whose values are 179, 160 and 136"

The cc functions are also available as binary infix operators.

x <- "important value"
x %+% "!"
#> [1] "important value!"




Reference manual

It appears you don't have a PDF plugin for this browser. You can click here to download the reference manual.


1.0.0 by James Dunham, 3 years ago

Report a bug at

Browse source code at

Authors: James Dunham [aut, cre]

Documentation:   PDF Manual  

GPL (>= 3.2) license

Imports methods

Suggests testthat

See at CRAN