From simon.urbanek at math.uni-augsburg.de  Sat Oct 30 05:28:54 2004
From: simon.urbanek at math.uni-augsburg.de (Simon Urbanek)
Date: Sat Oct 30 05:28:55 2004
Subject: [Rd] Destructive str(...)?
Message-ID: <D3643DB9-2A23-11D9-ABE2-0003938AF008@math.uni-augsburg.de>

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 
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?

Cheers,
Simon

[Tested with R 2.0.0 release (2004-10-04) on Mac OS X 10.3.5 - I have 
currently no other machine to test it on, but I very much suspect that 
this is platform-independent.]

the C code used to generate the object:

SEXP class, sref = R_MakeExternalPtr((void*) obj, R_NilValue, 
R_NilValue);
PROTECT(class = allocVector(STRSXP, 1));
SET_STRING_ELT(class, 0, mkChar("ObjCid"));
SET_CLASS(sref, class);
UNPROTECT(1);


[Rd] Destructive str(...)?
Simon Urbanek