Limiting variable scope Limiting variable scope r r

Limiting variable scope


I'm not sure that you want to do this in general, but the local() function should help, as should the codetools library.

In your example, try

f = local( function() { ... }, baseenv())

It does not do exactly what you want, but it should get you closer.


You can force a variable to be the local version with this function:

get_local <- function(variable){  get(variable, envir = parent.frame(), inherits = FALSE)  }

Compare these cases

y <- 0    f <- function(){  x <- y}    print(f())        # 0y <- 0    f <- function(){  y <- get_local("y")  x <- y}    print(f())        # Error: 'y' not found

Depending on what you are doing, you may also want to check to see if y was an argument to f, using formalArgs or formals.

g  <- function(x, y = TRUE, z = c("foo", "bar"), ...) 0formalArgs(g)# [1] "x"   "y"   "z"   "..."formals(g)#$x###$y#[1] TRUE##$z#c("foo", "bar")##$...

EDIT: The more general point of 'how to turn off lexical scoping without changing the contents of functions' is harder to solve. I'm fairly certain that the scoping rules are pretty ingrained into R. An alternative might be to use S-Plus, since it has different scoping rules.


You can check if y exists in the global environment using exists('y',envir=.GlobalEnv)