From simon.urbanek at r-project.org  Fri May 14 17:13:46 2010
From: simon.urbanek at r-project.org (Simon Urbanek)
Date: Fri, 14 May 2010 11:13:46 -0400
Subject: [Rd] Restrict access to variables in parent environment
In-Reply-To: <AANLkTinyl2u3qXHjXcoBbWhBg8YaWlF917j_fEgj-hhO@mail.gmail.com>
References: <AANLkTine-6pPbbOKspjOxOFF7qYC56KItUn_apBUKSgy@mail.gmail.com>
	<AANLkTinVN5_uVkOaryuBnmw5JTYWdqWRojFRdG41hC-7@mail.gmail.com>
	<AANLkTinyl2u3qXHjXcoBbWhBg8YaWlF917j_fEgj-hhO@mail.gmail.com>
Message-ID: <AA64B5C1-A3D4-48ED-AA40-CBDEF7C97073@r-project.org>


On May 14, 2010, at 10:29 AM, Jeff Ryan wrote:

> This isn't like a local variable though, since any function above the
> baseenv() in the search path will also not be found.
> 

Yes, but that is a consequence of the request and hence intended. You can always either specify the full path to the function or assign locally any functions you'll need:

> f = function(a) stats::rnorm(b)
> environment(f) <- baseenv()
> f()
Error in stats::rnorm(b) : object 'b' not found

> f = function(a) { rnorm=stats::rnorm; rnorm(b) }
> environment(f) <- baseenv()
> f()
Error in rnorm(b) : object 'b' not found

Alternatively you can use any environment up the search path hoping that those won't define further variables.

But back to the original question -- if taken literally, it's quite useless since it corresponds to using emptyenv() instead of baseenv() which means that you can't do anything:

> local(1+1,emptyenv())
Error in eval(expr, envir, enclos) : could not find function "+"


So likely the only useful(?) distinction would be to allow function lookup the regular way but change only the variable lookup to not look beyond the current environment. That is stretching it, though...

Cheers,
Simon





>> f
> function(a) { rnorm(b) }
> <environment: base>
> 
>> f()
> Error in f() : could not find function "rnorm"
> 
> Jeff
> 
> On Fri, May 14, 2010 at 9:20 AM, Hadley Wickham <hadley at rice.edu> wrote:
> 
>>> Hello All,
>>> 
>>> By default, a reference of a variable in a function cause R to look
>>> for the variable in the parent environment if it is not available in
>>> the current environment (without generating any errors or warnings).
>>> I'm wondering if there is a way to revert this behaviors, such that it
>>> will not look for the parent environment and will generate an error if
>>> the variable is not available in the current environment. Is this
>>> tuning has to be done at the C level?
>> 
>> Try this:
>> b <- 1
>> f <- function(a) {
>> b
>> }
>> 
>> environment(f) <- baseenv()
>> f()
>> 
>> Hadley
>> 
>> --
>> Assistant Professor / Dobelman Family Junior Chair
>> Department of Statistics / Rice University
>> http://had.co.nz/
>> 
>> ______________________________________________
>> R-devel at r-project.org mailing list
>> https://stat.ethz.ch/mailman/listinfo/r-devel
>> 
> 
> 
> 
> -- 
> Jeffrey Ryan
> jeffrey.ryan at insightalgo.com
> 
> ia: insight algorithmics
> www.insightalgo.com
> 
> 	[[alternative HTML version deleted]]
> 
> ______________________________________________
> R-devel at r-project.org mailing list
> https://stat.ethz.ch/mailman/listinfo/r-devel
> 
> 



[Rd] Restrict access to variables in parent environment
Simon Urbanek