On May 14, 2010, at 11:33 AM, [email protected] wrote:
> On Fri, May 14, 2010 at 10:13 AM, Simon Urbanek
> <[email protected]> wrote:
>>
>> 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...
>
> I didn't think of the corner cases. I'm OK with stats::rnorm or
> stats:::rnorm. But '{' is not recognized. How to make it be
> recognized?
>
You either include base or (if you don't want to) you have to create functions
for everything you'll need including `{` so for example:
> f=function(a) base::rnorm(b)
> environment(f)=mini.env
> mini.env=new.env(parent=emptyenv())
> import=c("{","::","+","rnorm") # add all functions you want to use
> for (fn in import) mini.env[[fn]] = get(fn)
> f=function(a) rnorm(a+b)
> environment(f)=mini.env
> f(1)
Error in rnorm(a + b) : object 'b' not found
Cheers,
Simon
> b=1
> f=function() {
> stats::rnorm(b)
> }
> f()
> #environment(f)=base()
> environment(f)=emptyenv()
> f()
>> 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 <[email protected]> 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/
>>>>
>>>> ______________________________________________
>>>> [email protected] mailing list
>>>> https://stat.ethz.ch/mailman/listinfo/r-devel
>>>>
>>>
>>>
>>>
>>> --
>>> Jeffrey Ryan
>>> [email protected]
>>>
>>> ia: insight algorithmics
>>> www.insightalgo.com
>>>
>>> [[alternative HTML version deleted]]
>>>
>>> ______________________________________________
>>> [email protected] mailing list
>>> https://stat.ethz.ch/mailman/listinfo/r-devel
>>>
>>>
>>
>> ______________________________________________
>> [email protected] mailing list
>> https://stat.ethz.ch/mailman/listinfo/r-devel
>>
>
>
>
> --
> Tom
>
>
______________________________________________
[email protected] mailing list
https://stat.ethz.ch/mailman/listinfo/r-devel