[R] No visible bindings and assignement to the global environment

Fabien Fivaz fabien.fivaz at unine.ch
Mon Dec 15 22:02:05 CET 2014


Thanks for the quick answer. Your second guess was right, I only need 
one environment.

I learned one thing: I can create a .R file in my package that is NOT a 
function. Something that contains just

dummyEnv <- new-env(parent=emptyenv())

And it works!
Thanks again

Le 15. 12. 14 19:47, Duncan Murdoch a écrit :
> On 15/12/2014 12:28 PM, Fabien Fivaz wrote:
>> Hi everyone,
>>
>> I'm sure this question has been asked before, but I'm unable to find a
>> definitive answer (if there is any). I've been trying to put back to
>> CRAN a package (grasp-r). The package uses many functions that share a
>> lot of common variables. For instance, a model call is created by the
>> first function and then used through all the modeling process, some
>> functions change it with :
>>
>> /assign("MODELCALL", MODELCALL, envir = .GlobalEnv)/
>>
>> some just use it without being explicitely called in the function
>> arguments. The assignement is explicitely against  the CRAN policies (Do
>> not alter the user's workspace). The use of variables raises a warning
>> when building the package : "no visible binding for global variable
>> ‘MODELCALL’".
>>
>> BTW, the old school "double" assignement
>>
>> /MODELCALL <<- MODELCALL/
>>
>> works but raises a similar warning "no visible binding for '<<-'
>> assignment to ‘MODELCALL’" And I understand that it is also against CRAN
>> policies to use the double assignement.
>>
>> Many user groups, examples et al. point to R environments. I could
>> create a new.env() in the first function (initializing function), and
>> assign all subsequent variables to it. Something like
>> /
>> /dummy<-function (a) //
>> //{//
>> //    dummy.env <- new.env()//
>> //    assign("a", a, envir=dummy.env)//
>>
>> //    return(dummy.env)//
>> //}/
>>
>> / and a call_that_variable_back function :/
>>
>> /dummy2<-function () //
>> //{//
>> //    b<-get("a",envir=dummy.env)//
>> //    b//
>> //}//
>> /
>> /It works, except that I have to put a enormous sign saying : don't call
>> your env anything else than dummy.env...
>>
>> What do you use ? Is there a best practice for that type of problem ?
>
> It's not clear to me from your description how many of these 
> environments you want.  Will a user potentially have more than one of 
> them?  If so, then create it in the first call, and pass it explicitly 
> to all other functions.  For example,
>
> makeit <- function() new.env(parent=emptyenv())
>
> fn1 <- function(env, ... ) { # get stuff from env using env$a, etc. }
> fn2 <- function(env, ...)  { # ditto }
>
> So your user would do something like this:
>
> env1 <- makeit() # create the first one
> fn1(env1, ...)      # use it
>
> env2 <- makeit() # create another
> fn1(env2, ...)   # use it
>
> fn1(env1, ...) # use the first one again
>
> On the other hand, maybe it only makes sense for one of these to ever 
> exist.  Then you should create one for the package,
> and just use that.  For example,
>
> env <- new.env(parent = emptyenv())
>
> fn1 <- function(...) { # get stuff from env using env$a, etc. }
> fn2 <- function(...) { # ditto }
>
> Users just call fn1 and fn2, and never need to even know about env.
>
> Duncan Murdoch

-- 
Fabien Fivaz
Centre suisse de cartographie de la faune
Passage Max.-Meuron 6
CH - 2000 Neuchâtel
Switzerland

Tel. +41 32 725 72 57
fabien.fivaz at unine.ch



More information about the R-help mailing list