From Giles.Heywood at CommerzbankIB.com  Thu Jan  8 12:06:33 2004
From: Giles.Heywood at CommerzbankIB.com (Heywood, Giles)
Date: Thu Jan  8 12:05:47 2004
Subject: [Rd] S3, S4, namespace
Message-ID: <8CBAA121CEB4D5118CB200508BB2BBEF05BF73F4@xmx8lonib.lonib.commerzbank.com>

I have encountered an issue which I have been unable to resolve, involving
an S3 generic (print) being declared S4 generic in a package, and the method
being exported.  This all works fine - the problem occurs when I try to
import the method to another package.

Here is the bit that works fine. -------------

#the .r file for package bar

setClass("bar",representation("numeric"))

if(!isGeneric("print")) {setGeneric("print",useAsDefault=print)}
setMethod("print",signature(x="bar"),
    print.bar <- function(x,...)
        {
        print("print method for bar")
        print(x@.Data,...)
        }
    )

if(!isGeneric("barprint")) {setGeneric("barprint",useAsDefault=print)}
setMethod("barprint",signature(x="bar"),
    printBar <- function(x,...)
        {
        print("barprint method for bar")
        print(x@.Data,...)
        }
    )

#the NAMESPACE file for package bar

import(methods)
exportMethods(barprint,print)
exportClasses("bar")

#then in R:

> require(barpkg)
Loading required package: barpkg 
[1] TRUE
> x <- new("bar",99)
> print(x)
[1] "print method for bar"
[1] 99
> barprint(x)
[1] "barprint method for bar"
[1] 99

Fine.

Here is the bit that I have not figured out. -------------

#the .r file for package waz

wazbar <- function(x)
    {
    barprint(new("bar",x))
    }

#the NAMESPACE file for package waz

import(methods,barpkg)
importMethodsFrom(barpkg)
importClassesFrom(barpkg)
export(wazbar)

#then in R

> require(wazpkg)
Loading required package: wazpkg 
[1] TRUE
> wazbar(99)
Error in .setMethodsForDispatch(f, fdef, resetMlist) : 
        Internal error: did not get a valid generic function object for
function "print"
Error in print("barprint method for bar") : 
        S language method selection got an error when called from internal
dispatch for function "print"

end of R bit ---------------------------

The problem goes away if I don't set print as an S4 generic in bar.

Can anyone help - maybe an error is obvious?  

As a bit of background, I am package maintainer for its (Irregular
Time-Series), and have been obliged to put it in a namespace or suffer a
significant performance penalty (about 6x slower).  In the package I make S3
generics (plot, print, summary etc) S4 generic in this package, and so far
have not got into trouble for doing so.  However, I have now got stuck -
possibly I have not seen the right documentation (I refer to the newsletter
article, and John Chambers' correspondence on R-devel early September).

- Giles

platform i386-pc-mingw32
arch     i386           
os       mingw32        
system   i386, mingw32  
status                  
major    1              
minor    8.1            
year     2003           
month    11             
day      21             
language R           

Rcmd install --doc="none"  barpkg


********************************************************************** 
This is a commercial communication from Commerzbank AG.\ \ T...{{dropped}}


[Rd] S3, S4, namespace
Heywood, Giles