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?
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