[Rd] classed

Douglas Bates bates@stat.wisc.edu
15 Sep 2000 12:47:28 -0500

I reached a similar conclusion to Thomas Lumley.  Here is the response
I wrote before I got a chance to read Thomas's response.

Paul Gilbert <pgilbert@bank-banque-canada.ca> writes:

> >If it doesn't use copy-on-write then the result will be additional
> >slowdown when all your data is copied again and again (I guess it depends
> >on how big the object is).
> I've often wondered about this. Any comments from someone who really knows the
> internals of R? When I first implemented it I did some testing and didn't notice
> any really big slowdown and I do use a lot of fairly big (multi MB size)
> objects. But notice that the difference is really in the function call, not in
> the copying of objects. A function using classed would end
>   classed(x, "whatever") }
> rather than
>  class(x) <- "whatever"
>  x}

Assignment functions like "class<-" are allowed to modify their first
argument in place.  That's the whole reason for using constructions
like foo[] <- bar, which is really a call to "[<-" with arguments foo
and bar, instead of foo <- bar.  It saves on copying.

An R function like classed(x, "cname") cannot modify its
arguments so it must return a copy.

I think the internal C code in src/main/attrib.c indicates that
do_classgets does not copy the first argument unless it happens to be
a named object.  (Does anyone know why a named object has to be copied?)

SEXP do_classgets(SEXP call, SEXP op, SEXP args, SEXP env)
    checkArity(op, args);
    if (NAMED(CAR(args)) == 2) SETCAR(args, duplicate(CAR(args)));
    if (length(CADR(args)) == 0) SETCADR(args, R_NilValue);
    setAttrib(CAR(args), R_ClassSymbol, CADR(args));
    return CAR(args);

r-devel mailing list -- Read http://www.ci.tuwien.ac.at/~hornik/R/R-FAQ.html
Send "info", "help", or "[un]subscribe"
(in the "body", not the subject !)  To: r-devel-request@stat.math.ethz.ch