[R] string concatenation operator

Prof Brian Ripley ripley at stats.ox.ac.uk
Fri Feb 25 08:48:29 CET 2005

On Fri, 25 Feb 2005, Henrik Bengtsson wrote:

> .Primitive() does not necessarily apply non-S3 generic function, cf.
> as.character().

You mean `imply'?  In fact "+" *is* S3 generic and has methods defined:

> methods("+")
[1] +.Date   +.POSIXt

It is also group-generic, part of the Ops group with many more methods 
via that route.  See ?Ops.

> An options is to do
> "+" <- function(...) UseMethod("+")
> "+.default" <- .Primitive("+")
> "+.character" <- function(...) paste(...,sep="")

> "abc" + "def" + "ghi"
> # [1] "abcdefghi"

[Re-defining R basics is seriously not recommended.]

> The question is if you want to do this. The "+" is probably non-generic for
> a purpose. One may be that having a generic function for such a basic method
> will most likely slow down many methods substantially.

Well, it is generic.  The issue is that only coercion between numeric 
(broad sense, including complex) types is supported for the arithmetical 
operators, presumably to avoid the ambiguity of things like

x <- 123.45
y <- as.character(1)
x + y

Should that be 124.45 or "123.451"?  One of the difficulties of any 
dispatch on two arguments is how to do the best matching on two classes, 
especially with symmetric operators like "+".  Internally R favours simple 
fast rules.

Brian D. Ripley,                  ripley at stats.ox.ac.uk
Professor of Applied Statistics,  http://www.stats.ox.ac.uk/~ripley/
University of Oxford,             Tel:  +44 1865 272861 (self)
1 South Parks Road,                     +44 1865 272866 (PA)
Oxford OX1 3TG, UK                Fax:  +44 1865 272595

More information about the R-help mailing list