[Rd] Formula evaluation, environments and attached packages

Milan Bouchet-Valat nalimilan at club.fr
Wed Apr 29 19:37:50 CEST 2015


Le mercredi 29 avril 2015 à 18:27 +0100, Heather Turner a écrit :
> Hi Milan,
> 
> I expect I may be able to do something about the way the terms are
> evaluated, to ensure the evaluation is done in the gnm namespace (while
> still ensuring the variables can be found!).
> 
> In the meantime, I think the following will work:
> 
> Mult <- gnm::Mult
>  f <- Freq ~ Eye + Hair + Mult(Eye, Hair)
> gnm::gnm(f, family=poisson, data=dat)
Indeed, that's a good trick, waiting for a more general solution.


Regards

> Hope that helps,
> 
> Heather
> 
> On Wed, Apr 29, 2015, at 05:57 PM, Milan Bouchet-Valat wrote:
> > Hi!
> > 
> > Some time ago, I replaced calls to library() with calls to
> > requireNamespace() in my package logmult, in order to follow the new
> > CRAN policies. But I just noticed it broke jackknife/bootstrap using
> > several workers via package parallel.
> > 
> > The reason is that I'm running model replicates on the workers, and the
> > formula includes non-standard terms like Mult() which are provided by
> > gnm. If gnm is not attached to the global namespace, these functions are
> > not found.
> > 
> > What would be the best solution to fix this? I tried changing the
> > environment of the formula to be gnm's namespace, but so far I failed.
> > 
> > Here's a reproducer using only gnm:
> > 
> > > dat <- structure(c(326, 688, 343, 98, 38, 116, 84, 48, 241, 584, 909, 
> > + 403, 110, 188, 412, 681, 3, 4, 26, 85), .Dim = 4:5, .Dimnames =
> > structure(list(
> > +     Eye = c("Blue", "Light", "Medium", "Dark"), Hair = c("Fair", 
> > +     "Red", "Medium", "Dark", "Black")), .Names = c("Eye", "Hair"
> > + )), class="table")
> > > 
> > > f <- Freq ~ Eye + Hair + Mult(Eye, Hair)
> > > gnm::gnm(f, family=poisson, data=dat)
> > Error in which(sapply(variables, function(x) { : 
> >   error in evaluating the argument 'x' in selecting a method for function
> >   'which':
> > Error in get(as.character(FUN), mode = "function", envir = envir) : 
> >   object 'Mult' of mode 'function' was not found
> > 
> > # Failed attempt by setting the environment
> > > environment(f) <- loadNamespace("gnm")
> > > environment(f)                        
> > <environment: namespace:gnm>
> > > gnm::gnm(f, family=poisson, data=dat)
> > Error in which(sapply(variables, function(x) { : 
> >   error in evaluating the argument 'x' in selecting a method for function
> >   'which':
> > Error in get(as.character(FUN), mode = "function", envir = envir) : 
> >   object 'Mult' of mode 'function' was not found
> > 
> > 
> > Thanks for your help



More information about the R-devel mailing list