[Rd] Functions that write functions in R packages
hadley wickham
h.wickham at gmail.com
Fri Feb 23 20:52:45 CET 2007
On 2/23/07, Duncan Murdoch <murdoch at stats.uwo.ca> wrote:
> On 2/23/2007 11:05 AM, hadley wickham wrote:
> > Dear all,
> >
> > Another question related to my ggplot package: I have made some
> > substantial changes to the backend of my package so that plot objects
> > can now describe themselves much better. A consequence of this is
> > that a number of convenience functions that previously I wrote by
> > hand, can now be written automatically. What is the best practice for
> > creating these functions for bundling in a package? I see three
> > possible solutions:
> >
> > * dump function specifications out to a .r file
> > * dynamically create at package build time so they are including in
> > the package rdata file
> > * dynamically create at package load time
> >
> > Can anyone offer any advice as to which is preferable? (or if there's
> > a better way I haven't thought of)
> >
> > My code currently looks like this (experimenting with two ways of
> > creating the functions)
> >
> > create_accessors <- function(objects, name, short=NULL) {
> > lapply(objects, function(x) {
> > assign(paste(name, x$objname, sep="_"), x$new, pos=globalenv())
> > if (!is.null(short)) {
> > eval(
> > substitute(
> > f <- function(plot, ...) plot + add(...),
> > list(
> > add = as.name(paste(name, x$objname, sep="_")),
> > f = as.name(paste(short, x$objname, sep=""))
> > )
> > ), envir = globalenv()
> > )
> >
> > }
> > })
> > }
>
> I'd say it's not a great idea to write to globalenv. What if your
> function stomps on my object of the same name? It would be better to
> set up your own environment and write these objects there. You could
> then attach that environment, and the user would see your functions (if
> he hadn't defined his own).
I agree - this is just my working code.
> If others of your functions need to call these, then you need to be
> careful with environments so that they don't accidentally call the
> user's function of the same name instead.
>
> With the considerations above, I think it would be easiest to do the
> creation at install time or earlier, rather than at load time.
But how should I do that? Is the easiest way simply to autogenerate
an R file, rather than the functions themselves?
Thanks,
Hadley
More information about the R-devel
mailing list