On May 14, 2010, at 11:33 AM, thmsfuller...@gmail.com wrote: > On Fri, May 14, 2010 at 10:13 AM, Simon Urbanek > <simon.urba...@r-project.org> 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 <had...@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@r-project.org mailing list >>>> https://stat.ethz.ch/mailman/listinfo/r-devel >>>> >>> >>> >>> >>> -- >>> Jeffrey Ryan >>> jeffrey.r...@insightalgo.com >>> >>> ia: insight algorithmics >>> www.insightalgo.com >>> >>> [[alternative HTML version deleted]] >>> >>> ______________________________________________ >>> R-devel@r-project.org mailing list >>> https://stat.ethz.ch/mailman/listinfo/r-devel >>> >>> >> >> ______________________________________________ >> R-devel@r-project.org mailing list >> https://stat.ethz.ch/mailman/listinfo/r-devel >> > > > > -- > Tom > > ______________________________________________ R-devel@r-project.org mailing list https://stat.ethz.ch/mailman/listinfo/r-devel