From ripley at stats.ox.ac.uk  Sat Dec 11 19:56:59 2004
From: ripley at stats.ox.ac.uk (Prof Brian Ripley)
Date: Sat Dec 11 19:57:18 2004
Subject: [Rd] RE: [R] Testing for S4 objects
In-Reply-To: <20041211175100.KMAS1919.tomts22-srv.bellnexxia.net@JohnDesktop8300>
References: <20041211175100.KMAS1919.tomts22-srv.bellnexxia.net@JohnDesktop8300>
Message-ID: <Pine.LNX.4.61.0412111805460.18577@gannet.stats>

On Sat, 11 Dec 2004, John Fox wrote:

> Thanks for this. I'll give your new definition of isS4object() a try. The
> function is used in my Rcmdr package, which provides a basic-statistics GUI
> for R. When an object -- the result of executing a command -- is printed, I
> test whether it is an S4 object to decide whether to use show() or print().

I think that *if* you have methods attached, it is OK there to always call 
show().  (You will not be using extra args to print(), e.g. digits, I 
presume.)  show() will call S3 methods for print() if it is given a non-S4 
classed object.

(Sorry, if I had realised what this about, I should have said that 
earlier.)

As I understand it (and I wrote some of it)

- auto-printing looks for an S4 object, and if it finds one, calls show(), 
otherwise calls the internals of print().  That test is at C level, and is

     if(tryS4 && isObject(x) && isMethodsDispatchOn()) {
 	SEXP class = getAttrib(x, R_ClassSymbol);
 	if(length(class) == 1) {
 	    /* internal version of isClass() */
 	    char str[201];
 	    snprintf(str, 200, ".__C__%s", CHAR(STRING_ELT(class, 0)));
 	    if(findVar(install(str), rho) != R_UnboundValue)
 		callShow = TRUE;
 	}
     }

where tryS4 is to ensure this is tried only once.  So an object is an S4 
object on which show() is to be called if it has a properly registered (S3 
or S4) class (the object bit, tested by isObject) of length one, and the 
class is registered by the methods code.

- show() calls print.default if it finds an S3 object, or an unclassed 
object.

- print.default() with only one arg calls show().

- If you have an S4 class and both show() and print() methods, 
auto-printing calls the show() method and explicit print()ing calls
the print() method.  Not a good idea, but it has happened in contributed 
packages.

Brian

-- 
Brian D. Ripley,                  ripley@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


[Rd] RE: [R] Testing for S4 objects
Prof Brian Ripley