On Sat, 30 Oct 2004, Prof Brian Ripley wrote:
On Fri, 29 Oct 2004, Simon Urbanek wrote:
I have encountered a strange behavior of the str function - it seems to modify the object that is displayed. Probably I'm using something unsupported (objects consisting just of an external reference), but
Yes, and I think it is documented somewhere, but I can't lay my hands on it right now.
still I'm curious as of why this happens. I create (in C code) EXTPTRSXP and associate a class to it via SET_CLASS. Such objects works fine until it's passed to str as the following output demonstrates:
> c<-.MCall("RController","getRController") > c [1] "<RController: 0x3be5d0>" > str(c) Class 'ObjCid' length 1 <pointer: 0x3be5d0> > c <pointer: 0x3be5d0> > str(c) length 1 <pointer: 0x3be5d0>
The .MCall basically produces an external reference and assigns a class (ObjCid) to it. There's a corresponding print method and it works fine. However, when str is called, it strips the class information from the object as a repeated call to str also shows:
> str(c); str(c) Class 'ObjCid' length 1 <pointer: 0x3be5d0> length 1 <pointer: 0x3be5d0>
Is this behavior intentional, undocumented or simply wrong?
The issue is almost certainly that something has forgotten/decided not to either set or respect SET_NAMED on the object, so when str does
object <- unclass(object)
or some such, the original object gets changed. Now the `something' has to be C code: possibly yours but probably something in R itself.
I think this is intentional. External references do not get copied, and the advice I recall is to wrap them in a list for use at R level (and before setting a class on them). In RODBC I took another tack, and attach the reference as an attribute to a `documentation' object.
str() probably ought to be more cautious when it encounters at external reference or similar exotic object, since it will look at list elements and attributes.
It's probably just unclass itself, not an issue with NAMED. External references are one of a handful of objects that are handled as references to mutable objects rather than as immutable values (the main other one being environments). unclass is destructive when applied to a reference object. At some point it might make sense to make unclass signal an error when used on a reference object, and clean up the things this breaks, including str and a number of other print methods. On the other hand, the same issue exists with all attributes on referece objects, so the safest approach is to use a wrapper as Brian suggests.
luke
-- Luke Tierney University of Iowa Phone: 319-335-3386 Department of Statistics and Fax: 319-335-3017 Actuarial Science 241 Schaeffer Hall email: [EMAIL PROTECTED] Iowa City, IA 52242 WWW: http://www.stat.uiowa.edu
______________________________________________ [EMAIL PROTECTED] mailing list https://stat.ethz.ch/mailman/listinfo/r-devel