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,                  [EMAIL PROTECTED]
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

______________________________________________
[EMAIL PROTECTED] mailing list
https://stat.ethz.ch/mailman/listinfo/r-devel

Reply via email to