[Rd] Packages, generics, S3 and S4

Heywood, Giles Giles.Heywood at CommerzbankIB.com
Thu Jul 10 12:13:08 MEST 2003


Thank you for assistance on this.

I have created the empty file "install.R" in the right place, and used 

Rcmd build its --binary

If I then use 

Rcmd INSTALL its --save

Everything works fine, with the generics along with other functions listed 
when I do ls(2) and not when I do ls().

However if I load the zip using the menu in RGUI,I get different behaviour.

When I load the package, I get

> local({pkg <- select.list(sort(.packages(all.available = TRUE)))
+ if(nchar(pkg)) library(pkg, character.only=TRUE)})
Error in open.connection(con, "rb") : unable to open connection
In addition: Warning message: 
cannot open compressed file `C:/PROGRA~1/R/rw1071/library/its/R/all.rda' 
Error in library(pkg, character.only = TRUE) : 
        .First.lib failed

I have looked at ?install.packages, but cannot see the 'saved image' option,
equivalent to --save on Rcmd INSTALL.

Is the RGUI installation of the zip file a bad idea?  Or perhaps I have
missed
out some qualifier in the Rcmd build stage?

Another issue is the one I referred to before - that Rcmd CHECK still errors
on
the examples.  I can get around it of course using dontrun, but of course
this 
a workaround and not a solution.

I have re-read section 1.3 of 'Writing R Extensions' and still can't fathom
these out - any further help will be gratefully received.  If it is along
the lines of RTFM, a page or section reference would be appreciated :)

Regards

Giles Heywood
Portfolio & Risk Advisory Group
Commerzbank Securities

tel	 + 44 20 7653 7009
fax	 + 44 20 7562 5347
mobile + 44 7973 266343
mailto:giles.heywood at commerzbankib.com
60 Gracechurch Street, London EC3V 0HR, U.K.
http://www.cbksec.com/rsh/portfolio&risk.html

> -----Original Message-----
> From: John Chambers [mailto:jmc at research.bell-labs.com]
> Sent: 09 July 2003 19:07
> To: Heywood, Giles
> Cc: 'r-devel at stat.math.ethz.ch'
> Subject: Re: [Rd] Packages, generics, S3 and S4
> 
> 
> "Heywood, Giles" wrote:
> > 
> > My question has two parts.
> > 
> > The first is with regard to the frame or environment in 
> which generic
> > functions are defined in packages.  It seems as though they 
> are defined
> > (i.e. exist as objects) in frame 1, even when defined in a package.
> 
> (Frame 1 is an S-Plus concept; presumably you mean the global
> environment, the first element in the search path.)
> 
> It seems likely you are not using the "saved image" option in the
> INSTALL command, which you should use if your package has S4 
> classes or
> methods.
> 
> The simple solution is to have a file called "install.R" in your main
> package directory (not in the R/ subdirectory).  For most 
> packages, the
> file can be empty.  See the online documentation for INSTALL 
> (but ignore
> the comment about having require(methods) in the install.R 
> file; this is
> out of date since the methods package is normally included by default
> now).
> 
> Standard calls to setClass, setMethod, etc. will then save the
> definitions in an image file that is loaded when the package is
> attached.  You need this, otherwise the definitions (currently) go to
> the global environment.  That part will be fixed, but you 
> want to use a
> saved image anyway, since otherwise the call to library() for the
> package will be much slower.
> 
> > 
> > The following is a short example:
> > 
> > setClass("track",representation(x="numeric",y="numeric"))
> > plotTrack <- function(x,y,...) 
> plot(x at x,x at y,xlab="",ylab="Value",...)
> > setGeneric("plotT",def=function(x,y,...) standardGeneric("plotT"))
> > setMethod("plotT",signature(x="track",y="missing"),plotTrack)
> > 
> > This which works with my 'examples', as follows:
> > 
> > x <- new("track",x=1:10,y=rnorm(10))
> > plotT(x)
> > 
> > The above also passes Rcmd CHECK with the following 
> warnings, which I
> > think are not related to my main question:
> > 
> > Undocumented code objects: "plotTrack"
> > Objects with usage in documentation object 'track' but 
> missing from code:
> > "plotT"
> > 
> > Slightly more worrying, I get the following:
> > 
> > * checking examples ... ERROR
> > Running examples failed.
> > 
> > Ignoring this (only for the time being), I now do 'make pkg-track',
> > and encounter no errors.  Loading the package, my 
> 'examples' work fine.
> > Returning to the ERROR, it is clear how this has come about.
> > 
> > ls(.GlobalEnv)
> > [1] "plotT"
> > 
> > So the genericFunction object plotT resides in frame 1  
> i.e. .GlobalEnv.
> > It gets deleted when cleanEx(env=.GlobalEnv) does its job 
> in Rcmd CHECK.
> > 
> > The other object defined in this package, plotTrack, is in frame 2:
> > 
> > ls(2)
> > [1] "plotTrack"
> > 
> > I have tried unsuccessfully to put the genericFunction 
> object plotT into
> > frame 2, using the 'where' argument in setGeneric.  To cut 
> a long story
> > short, I can put it anywhere _except_ frame 2.
> > 
> > Now it seems to me that I am barking up the wrong tree, but 
> I don't know
> > how to proceed.  Any guidance will be gratefully received.
> > 
> > The second part of my question is this.  I clearly want to 
> define a plot
> > method (not naming it plotT)for the 'track' class, which 
> indeed is what
> > is described in the 'Green Book' p43.  However the 'Green 
> Book' is largely
> > unencumbered by S3 methods AFAIK.  Venables & Ripley (2000) 
> addresses the
> > issue of defining an S4 generic on the same name as an S3 
> generic on p108.
> > 
> > setMethod("plot",signature(x="fungi",y="missing"),plot.fungi)
> > 
> > This clearly works, but I am not clear whether the 
> definition of an S4
> > generic
> > 'on top of' i.e. with the same name 'plot' as an S3 generic 
> (as in the
> > example
> > above) is generally regarded as bad practice, or is quite 
> OK.  If it is
> > done,
> > is the above a suitable template, or should the 'def' 
> argument be used?  
> 
> Generally, an S3 "generic" function (i.e., a function that calls
> UseMethod()) is not much different from an ordinary function 
> with no S3
> methods, so far as defining S4 methods is concerned.
> 
> Either way
> 
>   setGeneric("plot")
> 
> creates a new generic function and makes the current function the
> default method.  A call to setMethod() where there is no current S4
> generic function for this name does the setGeneric call for you.
> 
> The call to setGeneric with a `def' argument is usually 
> needed only when
> there is no function of the same name and/or you do not want 
> an existing
> function to be called as the default.
> 
> John
> 
> > I
> > know that the above _works_, I am more looking for guidance 
> on what is
> > regarded as 'good practice' and will not lead to too many 
> problems as the
> > S3->S4 migration proceeds.  Any indication of the planned 
> S3->S4 migration
> > path
> > and timetable would be a welcome bonus.
> > 
> > I realise that the second question has been aired before in 
> different
> > guises,
> > but I regret to say I still do not know the answer.
> > 
> > I am using NT, and R1.7.1, for the above examples.
> > 
> > Regards
> > 
> > Giles Heywood
> > Portfolio & Risk Advisory Group
> > Commerzbank Securities
> > 
> > tel      + 44 20 7653 7009
> > fax      + 44 20 7562 5347
> > mobile + 44 7973 266343
> > mailto:giles.heywood at commerzbankib.com
> > 60 Gracechurch Street, London EC3V 0HR, U.K.
> > http://www.cbksec.com/rsh/portfolio&risk.html
> > 
> > 
> **********************************************************************
> > This is a commercial communication from Commerzbank AG.\ \ 
> T...{{dropped}}
> > 
> > ______________________________________________
> > R-devel at stat.math.ethz.ch mailing list
> > https://www.stat.math.ethz.ch/mailman/listinfo/r-devel
> 
> -- 
> John M. Chambers                  jmc at bell-labs.com
> Bell Labs, Lucent Technologies    office: (908)582-2681
> 700 Mountain Avenue, Room 2C-282  fax:    (908)582-3340
> Murray Hill, NJ  07974            web: 
> http://www.cs.bell-labs.com/~jmc
> 


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



More information about the R-devel mailing list